我正在使用欧洲数学学会(EMS)的课程,该课程主要基于amsart.cls
但其中有一行具体说(所以我在评论中读到)他们重新定义 sub(sub)section(*),使子节末尾以点号排版。以下是我在文件中找到的代码(相关部分).cls
:
\let\s@bsection=\subsection
\newcommand{\c@mda}[2][]{\s@bsection[#1]{#2.}}
\newcommand{\c@mdb}[1]{\s@bsection*{#1.}}
\renewcommand{\subsection}{\secdef\c@mda\c@mdb}
我们明白了为什么会出现一个点。那么我有两个问题:
- 有人能告诉我在哪里可以读到发生了什么吗?我可以做出一些有根据的猜测(例如,
#2
第二行后面的点和#1
第三行后面的点应该与我的问题有关),但我希望我能理解写这篇文章的人在想什么…… - 如何维护
.cls
文件(我无权修改),因此所有小节都以点结尾,但对于一个非常单身的人来说其标题以问号结尾,因此产生了可怕的双标点符号。
我试过用\nopunct
,但没有用,既然我在这里,我想问一下
- 为什么没有?此代码与受影响的 amsart 代码有何区别
\nopunct
?
答案1
我找到了QT.cls
其中一个EMS类;由于它具有与您展示的相同的代码,所以我建议的方法如何删除段落标题中的最后一个句号(“.”)?似乎也有效。
\RequirePackage[2014/05/01]{latexrelease} % if you have an updated LaTeX distribution
\documentclass{QT}
\makeatletter
\renewcommand{\c@mda}[2][]{\s@bsection[#1]{#2\@addpunct{.}}}
\renewcommand{\c@mdb}[1]{\s@bsection*{#1\@addpunct{.}}}
\renewcommand{\subsection}{\secdef\c@mda\c@mdb}
\renewcommand{\c@mdsuba}[2][]{\s@bsubsection[#1]{#2\@addpunct{.}}}
\renewcommand{\c@mdsubb}[1]{\s@bsubsection*{#1\@addpunct{.}}}
\renewcommand{\subsubsection}{\secdef\c@mdsuba\c@mdsubb}
\makeatother
\title{A title}
\author{A. Uthor}
\address[[email protected]]{Somewhere}}
\begin{document}
\maketitle
\section{Section title}
Some text
\subsection{This has a period}
Some text
\subsection{Will this have one?}
Some text
\subsubsection{This has a period}
Some text
\subsubsection{Will this have one?}
Some text
\end{document}
为了避免出现问题,需要调用,latexrelease
因为该类amsthm
在错误的地方加载了的副本,所以它与最新的内核并不兼容。
但是,的定义\c@mda
仍然不好,因为它会在目录中为所有未指定可选参数的子部分添加一个空条目。它应该是这样的
\renewcommand{\c@mda}[2][]{%
\if\relax\detokenize{#1}\relax
\s@bsection[#2]{#2\@addpunct{.}}%
\else
\s@bsection[#1]{#2\@addpunct{.}}%
\fi
}
对于 也类似\c@mdsuba
。
它是如何\@addpunct
工作的?让我们看看它在 中的定义amsthm.sty
:
\def\@addpunct#1{%
\relax\ifhmode
\ifnum\spacefactor>\@m \else#1\fi
\fi}
是为了在表格单元格中首先出现或前面是执行扩展的某些操作时采取的\relax
预防措施。它不执行任何其他操作。宏的大部分位于内部条件中(如果在垂直或数学模式下发现它,它什么也不做,因为它本来就不应该在那里,而且也许更重要的是,在垂直和数学模式下不允许检查)。检查的当前值:仅当最后一个字符是标点符号而不是例如缩写中的句点(如)时,它才大于 1000(写为,但相同);类似的也会导致空间因子为 1000。如果空间因子高于 1000,则不执行任何操作,否则将打印参数。\@addpunct
\@addpunct
\spacefactor
\spacefactor
\@m
B.C.
i.e.\@
\@addpunct
因此,在 的情况下Will this have one?\@addpunct{.}
,句号实际上被吞噬,但在 中则不会This has a period\@addpunct{.}
。
\nonfrenchspacing
默认设置的命令(以及多个语言设置)babel
定义为
% latex.ltx, line 530:
\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
\sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
因此触发吞噬的字符\@addpunct
就是列在那里的那些。LaTeX 内核有
% latex.ltx, line 528:
\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
\sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
因此amsthm.sty
重新定义\frenchspacing
为
\def\frenchspacing{\sfcode`\.1006\sfcode`\?1005\sfcode`\!1004%
\sfcode`\:1003\sfcode`\;1002\sfcode`\,1001 }
这些空间因素不会对排版产生明显影响,例如句号后的空格将乘以 1.006,因此在 10pt 大小的 Computer Modern 中差异约为 0.02pt。选择不同的值是为了能够区分标点符号,以便扩展\@addpunct
其他宏的工作方式。