我正在尝试重新定义节符号 (§),以便它自动在其后放置一个空格。在文本中插入符号时,我通常会写成 ,这样我就可以得到和 之间\S{} Section Number
的间距。因为我这样做§
Section Number
每一次我认为我只需重新定义该命令。
这是我的尝试:
\documentclass[12pt]{article}
\let\OldS\S
\renewcommand{\S}{\OldS{}}
\begin{document}
\S 13
\OldS 13
\S{} 13
\OldS{} 13
\end{document}
\S
不幸的是,我似乎根本没有改变的行为——\S
和的\OldS
行为似乎完全相同。
为什么我尝试没有在\S
和以下文本之间产生所需的空间,我该如何修复它?
答案1
该命令\S
用 定义\DeclareRobustCommand
,因此用 重新定义它\renewcommand
不是最好的策略,请参阅何时使用 \LetLtxMacro?
如果你真的想要后面有一个空格\S
(我应该说这并不常见),最好在较低的级别上行动。
的核定义\S
是
% latex.ltx, line 1798:
\DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi}
所以更好的策略是
\usepackage{xspace}
\let\S\relax % to avoid spurious warnings
\DeclareRobustCommand{\S}{%
\ifmmode
\mathsection
\else
\textsection~%
\fi
}
您肯定不希望在 § 后换行,对吧?所以这~
是必要的。使用\xspace
并不能保证不在空格处换行。
注意。
\let\OldS\S
\renewcommand{\S}{\OldS\ }
\S
以标题或其他移动参数结尾的命令将导致二空格。为什么?
当 LaTeX 在.aux
文件中写入出现在图形标题中的命令时\S 1
,它将写入
\保护 \S \ 1
因为 的扩展\OldS
仍然是\protect\S
。文件中会写出相同的内容.lof
。.lof
读入文件时\protect
将被忽略,并\S
正常解释为\OldS\
;这意味着二空格,因为以下内容\
仍会存在。
为了获得“双§”,你可以这样做
\documentclass{article}
\makeatletter
\DeclareRobustCommand{\NS}{%
\textsection\@ifnextchar\NS{}{~}%
}
\makeatother
\begin{document}
\NS 1 and \NS\NS 2--3
\end{document}
\S
为您不想要空格的情况保留(尽管我看不出什么时候)。
不过,我相信最简单的方法是输入
\S~1 and \S\S~2--3
答案2
如何使用这个xspace
包:
\documentclass[12pt]{article}
\usepackage{xspace}
\let\OldS\S
\renewcommand{\S}{\OldS\xspace}
\begin{document}
\S 13
\OldS 13
\S{} 13
\OldS{} 13
\end{document}
优点是,如果您想\S
在句号或逗号前排版,xspace
则会自动省略额外的空格。