当宏的参数内部出现换行符时,会出现参数失控错误消息

当宏的参数内部出现换行符时,会出现参数失控错误消息

当我在参数中有一个换行符时,我的 \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}

...仔细观察{位置;-)

\/执行斜体修正如果有必要的话(用粗体字体就没有必要了,但它取决于字体);感谢@Skillmon指出这一点。

代码片段的输出

答案2

当 (La)TeX 在标准 catcode-régime 下以整数参数的标准值读取和标记输入时\endlinechar,两个连续的结束行字符(在 .tex-input 文件中,它们产生一个空行)被标记化为\par通常用于结束当前段落的标记(并且让 (La)TeX 开始一个新段落,以防接下来出现触发切换到水平模式的材料)。

在 (La)TeX 中,宏有两种形式:

  1. 允许在参数中使用标记的宏\par。这些是所谓的“长宏”,因为当您希望通过 TeX 基元(如\def\edef\gdef或 )定义此类宏时\xdef,您需要将前缀添加\long到正在使用的定义基元中。
  2. \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}

相关内容