我的文档中的每个图、表、公式和列表都有一个以句号结尾的标题。问题是,这些句号也显示在目录中,而它们不应该显示。
我发现了一个类似问题其目的是通过阻止将节号后面的句点写入文件来删除它们.aux
:
\makeatletter
\def\remove@@dot\csname the#1\endcsname{\Roman{#1}}
\def\p@section{\remove@@dot}
\makeatother
但是,我还没有找到对标题本身做同样事情的方法——话虽如此,我对 LaTeX 还很陌生。当然,可以向命令提供第二个参数(不带句点)来\caption
指定短的拼写,用于目录,像这样:\caption[Some caption]{Some caption.}
,但这些是我宁愿避免的冗余。
梅威瑟:
\documentclass[a4paper,11pt]{article}
\usepackage{tocloft}
\usepackage{listings}
%% Setup for list of equations
%% ========================================
\newcommand{\listequationsname}{Equations}
\newlistof{equations}{equ}{\listequationsname}
\newcommand{\eqcaption}[1]{%
\addcontentsline{equ}{equations}{\protect\numberline{\theequation}#1}\par%
}
%% Actual document
%% ========================================
\begin{document}
\listoffigures
\listoftables
\listofequations
\lstlistoflistings
%% Example elements with captions ending in a period
\begin{figure}[h]
\caption{Some figure.}
\end{figure}\noindent
\begin{table}[h]
\caption{Some table.}
\end{table}
\begin{equation}
\end{equation}\eqcaption{Some equation.}
\begin{lstlisting}[caption={Some code.}]
\end{lstlisting}
\end{document}
答案1
所以我找到了一个可行的解决方案,但绝对不是完美的。
对于图形和表格,我会覆盖默认\caption
命令以吞噬尾随句点(如果存在),但仅限于目录条目。
\usepackage{xstring}
\usepackage{etoolbox}
\let\Caption\caption
\renewcommand{\caption}[2][]{%
\ifstrempty{#1}{%
\IfEndWith{#2}{.}{%
\StrGobbleRight{#2}{1}[\result]%
\Caption[\result]{#2}%
}{%
\Caption[#2]{#2.}%
}%
}{\Caption[#1]{#2}}%
}
方程式标题也是如此,唯一的区别是命令已经是自定义的,所以这不是问题。
\newcommand{\eqcaption}[1]{%
\IfEndWith{#1}{.}{%
\StrGobbleRight{#1}{1}[\result]%
\addcontentsline{equ}{equations}{\protect\numberline{\theequation}\result}%
}{%
\addcontentsline{equ}{equations}{\protect\numberline{\theequation}#1}%
}\par%
}
最后,对于列表,我尝试通过修补底层 TeX 宏xpatch
但无法使其工作,因此我添加了一个新命令,该命令定义了两个我用于标题参数的值 - 一个带有句点,另一个不带有句点。
\newcommand{\lstcaption}[1]
{\IfEndWith{#1}{.}{%
\StrGobbleRight{#1}{1}[\result]%
\def\lsttoccap{\result}%
\def\lstcap{#1}}
{\def\lsttoccap{#1}%
\def\lstcap{#1.}}}
\lstcaption{Some code}
\begin{lstlisting}[caption={[\lsttoccap]\lstcap}]
\end{lstlisting}
我还添加了一项功能:如果没有明确指定,则会自动将句点附加到标题。