wrap LaTeX command in environment - latex

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

Related

Changing \thesection (latex) locally

How may I locally change \thesection command?
For example, in all chapters I'd like to have the usual \thesection, like
\arabic{chapter}.\arabic{section}, but in a single chapter I'd prefer to have just \arabic{section}.
Just set
{
\chapter{Here happen strange things}
\renewcommand{\thesection}{\arabic{section}}
\section{Without chapter-number}
}
By wrapping your modified chapter into braces, the renewcommand will only work in this single chapter, not outside of the block.
If needed don't forget to also change the numbering for subsection and subsubsection.

How to prevent LaTeX from hyphenating words containing a dash?

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.

LaTeX: Redefining the citation macro temporarily

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.

Trouble wrapping scalebox in an environment with fixed scale factor

The graphicx package provides a scalebox command. I'd like to encapsulate it in an environment like that:
\newenvironment{scaleb}{ \scalebox{0.7}{ } {}}
However, the second example below works, but the first one outputs the text without scaling and destroys all my layout.
\begin{scaleb}test\end{scaleb}
\scalebox{0.7}{test}
What am I doing wrong ?
You are trying to have unmatched { and } and the begin and end part of the environment, which TeX won't let you do. Your \newenvironment is read as follows by LaTeX:
\newenvironment{scaleb}{ \scalebox{0.7}{} {} }
so you have an empty \scalebox and no endscaleb-part. Accessing the content of an environment is slightly tricky and depends on your circumstances (can your scaleb environments be nested, do you want to be able to build new environments on top of scaleb so that you don't have a literal "\end{scaleb}" in your document, etc.)
Maybe the environ package can help you: http://www.ctan.org/tex-archive/macros/latex/contrib/environ/.

Annotated Table of Contents in LaTeX

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}

Resources