我知道在 LaTeX 中newcommand
定义为:
\newcommand{name}[num] {definition }
但我想定义一个新命令,其参数不在括号之间定义,而是在 \begin 和 \end 命令之间定义。例如,如下所示:
\teststart bla-bla-bla \testend
也许我应该定义两个newcommand
s,一个用于\teststart
,一个用于\testend
。
我应该提一下,我在包中看到过这样的命令changebar
,
\cbstart
并且\cbend
。
答案1
更高层次的可能性是xparse
:
\usepackage{xparse}
\NewDocumentCommand{\teststart}{+u{\testend}}{%
do something with #1%
}
允许+
参数包含空行。
答案2
这可以通过使用 TeX 来实现\def
,你需要一个特定的论据文本参数文本包括要替换的特定序列,以及形式为 的参数#X
(其中是从 到 的X
数字):1
9
\documentclass{article}
\def\teststart#1\testend{left-#1-right}
\begin{document}
\teststart this is something \testend
\end{document}
如果要在\teststart
和之间留出段落分隔符\testend
,则需要使用进行定义\long
\documentclass{article}
\long\def\teststart#1\testend{left-#1-right}
\begin{document}
\teststart this is
something \testend
\end{document}
答案3
您可以通过以下方式定义环境:
\newenvironment{test}{<commands to execute at beginning}{<commands for end}
您可以像这样使用环境:
\begin{test} bla-bla-bla \end{test}
如果您想要将命令应用于整个环境的内容,您可以使用包来实现environ
。宏\BODY
代表整个环境,因此您可以将命令应用于它。
\usepackage{environ}
\NewEnviron{test}{<before>\dosomethingtobody{\BODY}<after>}
答案4
为了进行比较,以下是一种更低级的方法:
\documentclass{article}
\newcommand\teststart{%
\begingroup % start a group
\bfseries % make the content bold, for demo purposes
\let\testend\endgroup % within this 'environment' (only),
% \testend acts to close the group
}
\begin{document}
Here is some text, \teststart which
has test content\testend within it.
And that content \teststart can go over multiple paragraphs.
For example.\testend
\end{document}
这与该机制的工作方式大致相似\begin{env}...\end{env}
。
命令\begingroup
和\endgroup
创建并终止一个组而不使用{...}
(当然,在定义中这不会显得不平衡)。