如果你使用amsart
类,那么它会在小节标题后添加一个句号,但如果没有标题则不会。例如,如果我写
\subsection{Title}
Blah1
\subsection{}
Blah2
然后amsart
产生
0.1。标题。布拉1
0.2. Blah2
我尝试使用 titlesec 包在文章类中实现这一点,但到目前为止,我可以让句号始终出现或从不出现。因此,使用与上述相同的编码,我得到
0.1。标题。布拉1
0.2。。布拉2
(请注意 0.2 后面的额外句号)或
0.1。标题布拉1
0.2. Blah2
是否有人知道如何仅在有标题的情况下才在小节标题后面显示句号?
答案1
在以下示例中,我使用了条件条件包中定义了一个用户命令,借助于\@ifmtarg
,用于测试空宏参数(将处理零个或多个空格);explicit
titlesec 选项用于使用来控制标题#1
;在内部执行空性测试\titleformat
:
\documentclass{article}
\usepackage{ifmtarg}
\usepackage[explicit]{titlesec}
\makeatletter
\newcommand\titleempty[1]{\@ifmtarg{#1}{}{#1.}}
\makeatother
\titleformat{\subsection}[runin]
{\normalfont\large\bfseries}{\thesubsection}{1em}{\titleempty{#1}}
\begin{document}
\subsection{Test Section} test text
\subsection{ } test text
\end{document}
答案2
使用以下方法可以实现titlesec
的explicit
选择:
\documentclass{article}
\usepackage[explicit]{titlesec}% http://ctan.org/pkg/titlesec
\makeatletter
\titleformat{\subsection}[runin]{\large\bfseries}{}{0pt}{%
\setbox0=\hbox{\ignorespaces#1\unskip}%
\thesubsection\quad\ifdim\wd0>\z@\relax#1.\fi%
}
\makeatother
\begin{document}
\section{Title}
\subsection{Title} Blah
\subsection{} Blah
\end{document}
explicit
允许您使用#1
将参数放置到\subsection
。但是,它还*
从混合中删除了 -variant 的简单使用。不确定这是否是必需的。
上述操作将\subsection
标题设置在框 0 中,测试其宽度(以查看它是否为空,如果不为空,则将标题设置为句点。因此,以句点结尾的标题当然会导致双句点。这会\@addpunct
有所帮助。
这是另一种选择etoolbox
:
\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\patchcmd{\@sect}% <cmd>
{#8}% <search>
{\setbox0=\hbox{\ignorespaces#8\unskip}\usebox0\ifnum2=#2\ifdim\wd0>\z@.\fi\fi}% <replace>
{}{}% <success><failure>
\makeatother
\begin{document}
\section{Title}
\subsection{Title} Blah
\subsection{ } Blah
\end{document}
它遵循与上述相同的方法,但直接修复了最终的分段调用。条件\ifnum#2=2
指的是\subsection
级别(级别 2)。对于所有其他部分,不添加标点符号。