我定义了一个\tstcmd
带有一个参数的命令为\@hangfrom{[#1]{ }}\nobreak
。在使用此命令时,我发现右括号和后面的文本之间总是有一个多余的空格。
以下是 MWE:
\documentclass{article}
\makeatletter
\def\tstcmd#1{\@hangfrom{[#1]{ }}\nobreak}
%%\DeclareRobustCommand\tstcmd[1]{\@hangfrom{[#1]{ }}\nobreak} %%No difference
\def\hf{\@hangfrom}
\makeatother
\begin{document}
\tstcmd{1} fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf
fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd fsdfsd
pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd
\hf{[1]{ }}\nobreak fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw
hojsoisdjf fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf
fsdfsd fsdfsd pppwp fsdfsd fsdfsd ewrwerw hojsoisdjf fsdfsd
\end{document}
即使\DeclareRobustCommand
使用了,多余的空间仍然存在,显然\nobreak
in\tstcmd
无效。有人知道为什么会这样以及如何修复它吗?提前致谢。
答案1
\DeclareRobustCommand 与您描述的问题无关。如果您想将\tstcmd
调用放在命令的参数中(例如) ,这将很有用\section
,其中未受 \protected 的内容会得到扩展在将其写入 .toc 文件之前。 \DeclareRobustCommand 将确保在这种情况下命令不会被扩展,但它在这里似乎不是很有用。
\nobreak
应该先行当您不希望它成为合法断点时,请添加一个粘合项(此处为您的空间),不要遵循它。您的多余空间来自这样一个事实:您在{ }
宏定义中写了一个空间标记,并在调用站点之后紧接着写了另一个空间标记\tstcmd{1}
。我建议这样做:
\newcommand*{\tstcmd}[1]{%
\@hangfrom{[#1] }\nolinebreak\ignorespaces}
给出您使用命令的方式(即,之后应该忽略一个空格标记)。