如何重新定义节符号(§)?

如何重新定义节符号(§)?

我正在尝试重新定义节符号 (§),以便它自动在其后放置一个空格。在文本中插入符号时,我通常会写成 ,这样我就可以得到和 之间\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则会自动省略额外的空格。

xspace 使用

相关内容