定义不带括号的“newcommand”

定义不带括号的“newcommand”

我知道在 LaTeX 中newcommand定义为:

\newcommand{name}[num] {definition }

但我想定义一个新命令,其参数不在括号之间定义,而是在 \begin 和 \end 命令之间定义。例如,如下所示:

\teststart bla-bla-bla \testend

也许我应该定义两个newcommands,一个用于\teststart,一个用于\testend

我应该提一下,我在包中看到过这样的命令changebar\cbstart并且\cbend

答案1

更高层次的可能性是xparse

\usepackage{xparse}

\NewDocumentCommand{\teststart}{+u{\testend}}{%
  do something with #1%
}

允许+参数包含空行。

答案2

这可以通过使用 TeX 来实现\def,你需要一个特定的论据文本参数文本包括要替换的特定序列,以及形式为 的参数#X(其中是从 到 的X数字):19

在此处输入图片描述

\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创建并终止一个组而不使用{...}(当然,在定义中这不会显得不平衡)。

相关内容