当我在参数中有一个换行符时,我的 \newcommand 出现了问题,它的定义如下:
\documentclass{report}
\newcommand{\noblablabla}[2]{\textbf{#1}-#2}
\begin{document}
\noblablabla{aaaabbbb}{xxxx} % this is OK
\noblablabla{aaaa
bbbb}{xxxx}
\end{document}
第一次调用正常,第二次调用出现 Runaway 参数错误,结果如下:
bbbb}{xxxx}
% ^^ up here "Runaway argument"
当我尊重这样的事情时
答案1
正如评论中所建议的,\textbf
它是为短小的东西而设计的 --- 而不是段落。您只需更改为字体选择命令即可:
\documentclass{report}
\newcommand{\noblablabla}[2]{{\bfseries #1\/}-#2}
\begin{document}
\noblablabla{aaaabbbb}{xxxx} % this is OK
\noblablabla{aaaa
bbbb}{xxxx}
% no more "Runaway argument"
\end{document}
...仔细观察{
位置;-)
答案2
当 (La)TeX 在标准 catcode-régime 下以整数参数的标准值读取和标记输入时\endlinechar
,两个连续的结束行字符(在 .tex-input 文件中,它们产生一个空行)被标记化为\par
通常用于结束当前段落的标记(并且让 (La)TeX 开始一个新段落,以防接下来出现触发切换到水平模式的材料)。
在 (La)TeX 中,宏有两种形式:
- 允许在参数中使用标记的宏
\par
。这些是所谓的“长宏”,因为当您希望通过 TeX 基元(如\def
或\edef
或\gdef
或 )定义此类宏时\xdef
,您需要将前缀添加\long
到正在使用的定义基元中。 \par
不允许在参数中使用标记的宏。许多人称它们为“短宏”,因为在定义它们时会省略\long
-前缀。当短宏的参数包含标记时\par
,您会收到一条错误消息,提示“参数失控?... 段落在 ... 完成之前结束”。
\textbf
被定义为调用这样一个“短”宏,其名称为\text@command
,并将其参数作为参数传递给该宏。因此出现错误消息。您可以通过不在\par
参数中使用标记,而是\csname par\endcsname
在参数中使用标记序列或\myparcopy
之后的标记来轻松规避该消息\let\myparcopy=\par
:
\documentclass{report}
\newcommand{\noblablabla}[2]{\textbf{#1}-#2}
\begin{document}
\noblablabla{aaaabbbb}{xxxx} % this is OK
\noblablabla{aaaa\csname par\endcsname bbbb}{xxxx}
\end{document}
\documentclass{report}
\newcommand\myparcopy{}%
\newcommand{\noblablabla}[2]{\textbf{#1}-#2}
\begin{document}
\noblablabla{aaaabbbb}{xxxx} % this is OK
\let\myparcopy=\par
\noblablabla{aaaa\myparcopy bbbb}{xxxx}
\end{document}