我想要获得一个被开始和结束命令包围的文本,如下所示。
\begincommand
Here any text is written.
\endcommand
\surroundedtext % this command is replaced with "Here any text is written."
当然,如果我定义 \begincommand 使其接受一个参数,那么该对象就完成了。
\def\begincommand#1{...}
\begincommand{Here any text is written.}
但是,我不想使用大括号。如果您有解决方案,请告诉我。
答案1
假设使用 Plain TeX,你可以定义
\long\def\begincommand#1 \endcommand{...}
但这会迫使你写
\begincommand
Text to be stored
\endcommand
单独成\endcommand
一行或
\begincommand
Text to be stored \endcommand
在最后一个单词和 之间有一个空格\endcommand
(但在 之前没有空行\encommand
)。或者,你可以定义
\long\def\begincommand#1\endcommand{...}
然后对可能出现的最后一个空格(当\endcommand
它单独位于一行时)进行处理。为了给出更好的建议,应该了解上下文。
如果您使用的是 LaTeX,那么这不是好的编程风格。如果您正在寻找的是“定义”的环境形式,那么environ
Leo Liu 建议的包很方便,但在定义使用环境主体以供后续使用的命令时会遇到一些挑战。
\usepackage{environ}
\NewEnviron{command}{%
\long\xdef\surroundedtext{%
\unexpanded{<pre>}%
\unexpanded\expandafter{\BODY}%
\unexpanded{<post>}}%
}
因此代码
\begin{command}
Text to be stored
\end{command}
相当于
\newcommand{\surroundedtext}{<pre>Text to be stored<post>}
添加你需要的任何东西来代替<pre>
和<post>
答案2
您可以看到 LaTeX 包的实现environ
,或者直接使用这个包。
例子:
\documentclass{article}
\usepackage{environ}
\NewEnviron{foo}{(\textbf{\BODY})}
\begin{document}
\begin{foo}
body
\end{foo}
\end{document}