I'm new to latex, but it seems you can temporarily redefine some commands? The problem I have is that normally the citation is (SMITH, 2000). But at times, I'd like to have Smith (2000) instead. Anyway I can temporarily redefine it, then use the standard version again after that "block" of code?
Enclose the local definition in braces ({}).
\newcommand\foo{FOO!}
\foo
{\renewcommand\foo{BAR?}\foo\foo}
\foo
This will generate something like:
FOO!BAR?BAR? FOO!
This can be done inside macro definitions, too - just make sure you add the extra braces:
\newcommand\newfoo{{\renewcommand\foo{BAR?}\foo}}
Hope this helps.
You should already have \citep and \citet commands that should do what you want, there's no reason to redefine the macros yourself.
Related
I would like to globally prevent LaTeX from hyphenating 'Objective-C'. I am aware of the \hyphenation command, but I don't see how I can make use of it. If I pass 'Objective-C' to this command, the dash will be treated as a hint to hyphenate the word there.
One solution I found is wrapping Objective-C into an mbox each time I use it. However, the document I am writing contains this name a lot, and wrapping it into an mbox each time is ugly (as is defining a command and using this over and over again in the source code).
Why is defining a new command ugly? It's how \LaTeX\ defines itself.
\def\ObjectiveC{\mbox{Objective-C}}
Use \nobreakdash. That's what LyX produces when I insert a nonbreakingdash and convert it to tex.
As suggested here, you could define a command like this:
\newcommand\dash{\nobreakdash-\hspace{0pt}}
and use it like this
Consider the $n$\dash dimensional manifold ...
Also, you could use the babel package and use "~ as a protected hyphen. I'm not sure if using babel is advisable when writing in english, though.
As the title says I need to define a QED symbol automatically (preferable a colorbox) at the end of my custom newtheorem.
Any suggestions would be appreciated.
Advice: don't do it. The placing of the QED symbol depends in a non-straightforward way on the contents of your text in your environment. For instance, Andrea's code will fail if your theorem ends with display math. You will probably need to place it by hand sometimes, and you are less likely to overlook things if you always do this.
Much better would be to have an environment that complains if the QED symbol has not been placed. You can do this by defining a qedused flag, say by \newififqedused, that is unset when you enter the environment (define a wrapper using \newenvironment as Andrea said), set in a wrapper around the QED symbol, and tested when you exit the environment. If the flag is still unset on exit, issue a \PackageWarning or \PackageError.
If you really want to try to get a qed environment that tries hard to do the right thing, regardless of what is in the environment, you'll need to look into the contents of \lastbox to try to determine where the QED symbol should go. If it is an hbox, you are fine, just place the QED as per Andreas' solution. If it is an mbox, then I think making an hbox containing this mbox followed by the QED symbol should work - I'm not sure, I don't usually mess about with the typesetting of maths.
If it is a vbox, you need to look inside the structure of the vbox to find where it should go, which sounds hard - I can't think how to do that in pure Tex. In Luatex, I think that Hans Hagen's trick in The LuaTEX way: \framed might be adapted for this.
I'm not sure what you mean. If you use the package amsthm you have the command \qed to put a QED wherever you want.
You can customize the \qed by changing the command \qedsymbol. So you would do something like
\usepackage{amsthm}
\renewcommand{\qedsymbol}{$\heartsuit$}
\newtheorem{thm}{Theorem}
\newenvironment{\mythm}{\begin{\thm}}{\qed \end{thm}}
...
\begin{mythm}
blah
\end{mythm}
This if you want the QED symbol to be the same that appears in proofs. If not you can do simply
\newtheorem{thm}{Theorem}
\newenvironment{\mythm}{\begin{\thm}}{\hfill $\heartsuit$ \end{thm}}
...
\begin{mythm}
blah
\end{mythm}
Of course you can change \heartsuit with whatever you want.
An alternative is to use the ntheorem package with the options thmarks. that is \usepackage[thmarks]{ntheorem}.
You can then play with the settings to get what you want exactly...
How can I wrap a LaTeX command in an environment? In essence, how can I turn \somecommand{contents} into \begin{somecommand} contents \end{somecommand}? I have tried the obvious in creating a new environment as such:
\newenvironment{somecommand}[0]{
\somecommand{
}
{
}
}
but this causes problems with the curly brackets. Let me give a more concrete example. Say that you want to create the environment very-important and you want to use the command emph to accomplish this. An straightforward (but incorrect) solution would be to write something as
\newenvironment{very-important}[0]{
\emph{
}
{
}
}
The problem here is that the command works with the information that is found inside the environment, so it is not one of the opening commands of the environment, nor is it a closing command of the environment. The question is then: how can you do this?
This can be done with the environ package as follows:
\usepackage{environ}
...
\NewEnviron{very-important}{\emph{\BODY}}
\BODY contains the body of the environment, and environments may be nested. See the documentation for more details.
It seems that now I can guess what is the question.
\newenvironment{very-important}{\startimportant}{}
\def\startimportant#1\end{\emph{#1}\end}
\begin{very-important}
Something
\end{very-important}
This solution works well.
But IMHO it is bad idea to wrap all text in the environment. Why?
There are two ways to do something with the text.
For example, you want to change the font and use italic.
The first method. \textit{sentence written in italics}
The second method. {\it sentence written in italics\/}
What is the difference? The thing is that first method use the second one.
\it macro changes the font and the brace } changes it back.
\textit macro reads the full argument, changes the font and inserts the argument again:
\textit is defined roughly as follows (not exactly).
\def\texit#1{{\it#1\/}}
The first method is always doing extra work. It reads the argument twice.
Almost always, you can make changes and then you can everything back.
Eventually why do you use the environment? Use macros.
\veryimportant{
Any thought
}
A Simpler way could be:
\newenvironment{somecommand}[0]{
\somecommand\bgroup
}
{
\egroup
}
Explanation: \bgroup works like { and \egroup works like }.
New environment somecommand defines the macro \somecommand.
You can not use macro with the same name \somecommand inside.
Moreover you should write
\newenvironment{name}{openning command}{closing commands}
rather than
\newenvironment{somecommand}[0]{ \somecommand{ } { } }
You obviously have a problem with closing commands.
define command
\newcommnad{eqn}{1}{\begin{equation}#1\end{equation}}
will change
\eqn{x^2=y}
to
\begin{equation}
x^2=y
\end{equation}
I think
I'd like to use LaTeX's \tableofcontents command (or some equivalent) to automatically generate a table of contents, but I'd also like to add a sentence or two to each line in the table of contents that describes what the referenced section is about. How can I do this?
The tocloft package and its \cftchapterprecistoc command solved my problem.
Try
\addcontentsline{toc}{section}{sample text}
Follwoing Oliver and simon's advice:
You could redefine the sectioning commands to take a second (possibly optional) argument, and use that to build your argument to \addtocontentsline, and then involk the cooresponding section* command.
I expect you can brute force and ignorance something using addcontentsline.
eg:
\addcontentsline{toc}{section}{text}
however, this will conflict with automagically generated lines if you don't use the starred versions of sections it refers to.
Anything more clean will require messing about with the relevant macros....unless I'm missing something.
I would change the {section} part to {subsection}.
\addcontentsline{toc}{subsection}{sample text}
Pursuant to this question:
Redefining Commands in a New Environment
How does one redefine (or define using \def) a macro that uses parameters? I keep getting an illegal parameter definition in \foo error. Since I require custom delimiters, I can't use \newcommand or \renewcommand.
A general form of my code looks like this:
\newenvironment{foo}{%
...spacing stuff and counter defs...
\def\fooitem#1. #2\endfooitem{%
...stuff...
}
\def\endfooitem{endfoo}
}
{...after material (spacing)...}
This must be possible. Right now I'm using plain-TeX definitions (as I mentioned in the question above) but I'd really like to be consistent with the LaTeX system.
You need to double the # characters for every nested definition. Internally, a \newcommand or a \newenvironment is calling \def.
\newenvironment{foo}{%
...
\def\fooitem##1. ##2\endfooitem{%
...
Besides that, this is the way to do what you're trying to do; there is no pure-LaTeX method to define a macro with delimited arguments.