当第一次在类中的多行图形标题中使用首字母缩略词(包\ac{}
中的宏)时,它不会像在正文或单行图形标题中那样拼出完整的定义。acronym
IEEEtran
这是MWE:
\documentclass[conference]{IEEEtran}
\usepackage{acronym}
\begin{document}
\newacro{FTP}{File Transfer Protocol}
\newacro{HTTP}{Hypertext Transfer Protocol}
I have some figures to show you.
\begin{figure}[t]
\begin{minipage}{1\linewidth}Hello World!\end{minipage}
\caption{The \ac{FTP} Example with a Lot More Text to Word Wrap to the Next Line}
\end{figure}
\begin{figure}[t]
\begin{minipage}{1\linewidth}Hello World!\end{minipage}
\caption{The \ac{HTTP} Example}
\end{figure}
\end{document}
从 开始ieeetran.cls
,这是较短和较长字幕之间的区别,第 2783 至 2788 行,日期为 2015/08/26 版本 V1.8b:
% 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one
\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}%
\ifdim \wd\@tempboxa >\hsize%
% if caption is longer than a line, let it wrap around
\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}%
\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}%
显然,当标题对于行宽来说太长时,LaTeX 会再次尝试,parbox
但现在该首字母缩略词已被标记为已使用,因此在第二次尝试中,我只看到该首字母缩略词的简短定义。
关于该IEEEtran
课程,我尝试了其他课程选项,但在.cls 文件中看到它们似乎都使用相同的算法。
几个类似的已回答的问题有很大不同,以至于我无法将它们的解决方案转化为适合此配置的解决方案。
我怎样才能克服将IEEEtran
首字母缩略词标记为已使用的“第一次尝试”,以便我的多行图形标题在第一次使用时可以具有首字母缩略词的完整定义?
答案1
这个问题有一个解决方法,但我相信对于这个IEEEtran
班级来说有一个更好的解决方案。
解决方法是将此代码放入文档序言中:
\makeatletter
\renewcommand{\@makecaption}[2]{%
% test if is a for a figure or table
\ifx\@captype\@IEEEtablestring%
% if a table, do table caption
\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize #1}\\{\normalfont\footnotesize\scshape #2}\par\addvspace{0.5\baselineskip}\egroup%
\@IEEEtablecaptionsepspace
% if not a table, format it as a figure
\else
\@IEEEfigurecaptionsepspace
% 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one
\def\tempcapdesc{#1.\nobreakspace\nobreakspace #2}%
\let\oldacused\acused%
\let\oldAC@placelabel\AC@placelabel%
\let\acused\@gobble%
\let\AC@placelabel\@gobble%
%\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}%
\setbox\@tempboxa\hbox{\normalfont\footnotesize\tempcapdesc}%
\let\acused\oldacused
\let\AC@placelabel\oldAC@placelabel
\ifdim \wd\@tempboxa >\hsize%
% if caption is longer than a line, let it wrap around
%\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}%
%\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}%
\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\tempcapdesc}%
% if caption is shorter than a line, center if conference, left justify otherwise
\else%
%\ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}%
%\else \hbox to\hsize{\normalfont\footnotesize\box\@tempboxa\hfil}%
\ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\tempcapdesc\hfil}%
\else \hbox to\hsize{\normalfont\footnotesize\tempcapdesc\hfil}%
\fi\fi\fi}
\makeatother
基本上,这是和之间第 2774-2793 行(日期为 2015/08/26 版本 V1.8b,这是本文的最新版本)的修改版本ieeetran.cls
(宏的定义) 。它的工作原理如下:\@makecaption
\makeatletter
\makeatother
- 为了克服扩展标题以测量其宽度,然后在其宽度大于可用水平空间时再次扩展它的逻辑,我创建了宏
\tempcapdesc
来简化对\@makecaption
参数的访问。 - 我跟着这个例子暂时吞噬适用的
acronym
包宏,\acused
并且\AC@placelabel
。 - 当这些宏被“吞噬”时,我运行了原始宽度测试
\ifdim
。 - 完成宽度测试后,我恢复了
acronym
包宏。 - 无论宽度测试的结果如何,我都根据现有的 IEEE 样式重新扩展了标题,但这一次,封装
acronym
宏\acused
并工作就像我第一次\AC@placelabel
扩展封闭的宏一样。\ac
笔记:
- 我保留了原始代码但将其注释掉以供参考和比较。
- 此解决方法适用于不使用类选项
compsoc
的文档ieeetran
。如果您需要对文档使用此解决方法compsoc
,则需要将此解决方案调整为紧接在修改后的摘录之前的代码ieeetran.cls
。
我寻找一个可以作为课程补丁的更好的解决方案IEEEtran
,并想到了几个选项。
首先,请注意,它ieeetran.cls
有一个非平凡的条件嵌套(if-else 语句),可根据IEEEtran
包选项以及它们是表格还是图形标题来以不同的方式格式化标题。此代码跨越 2730-2794 行。查看此代码并比较样式并没有发现任何简化它的直接方法。
一种选择是将这种解决方法应用到课堂上IEEEtran
。虽然这是一种选择,但我不认为这是一个好的选择。首先,可能有很多IEEEtran
用户不使用该acronym
包,因此\let
暂时禁用/吞噬acronym
包宏的语句会导致 LaTeX 抛出无法找到指定宏的错误。虽然使用\@ifpackageloaded
宏很容易解决这个问题,但由于必须在每个 if 语句分支中实现它,这很快就会变得难以处理。此外,acronym
只是至少三个提供首字母缩略词功能的包之一(acro
还有glossaries
另外两个),我们还需要考虑这些包。此选项将使当前跨越 2730-2794 行的代码行数增加约一倍。
另一种选择是在当前字幕条件嵌套之外创建一个执行宽度测试的宏。这里的挑战是让宽度测试考虑样式,因为样式会影响宽度。将此宽度测试宏分开可以让用户更轻松地更新/重新定义此宏以考虑他们正在使用的任何支持首字母缩略词的包。这些重新定义也可以在类文档中提供IEEEtran
,就像这里提供的示例一样: https://www.michaelshell.org/tex/ieeetran/。
可能还有更好的方法来改进IEEEtran
类,以解释图片标题中的首字母缩略词用法。如果在此处发布,投票将有助于做出决定。