自动添加缩写列表(totcount 和首字母缩略词)

自动添加缩写列表(totcount 和首字母缩略词)

如果有缩写,我希望自动添加缩写列表。

\ac我正在使用缩写的首字母缩略词,目前正尝试使用 totcount来计算 命令。

\documentclass[english, a4paper, 10pt]{article}

%abbreviations
\usepackage[printonlyused]{acronym}

%count acronyms
\usepackage{totcount}
\newtotcounter{acro_num}
\def\oldac{} \let\oldac=\ac
%FIXME_1: \def\ac{\stepcounter{acro_num}\oldac}

\begin{document}

\section{Document Start}

%list of abbrev
\ifnum\totvalue{acro_num}>0%
\section*{List of Abbreviations}
\fi
\begin{acronym}[12345678]
\setlength{\parskip}{0pt}
\setlength{\partopsep}{0pt}
\setlength{\topsep}{0pt}
\setlength{\parsep}{0pt}
\setlength{\itemsep}{0pt}
  %list of acronyms
  \acro{ABR}{abbreviation}
\end{acronym}
\ifnum\totvalue{acro_num}>0%
\clearpage
\fi


%reset abreviations
\acresetall

%document
\section{Amazing...}

%FIXME_2: \ac{ABR} is working!

Bla bla...

\end{document}

问题:
如果FIXME_1被注释掉并且FIXME_2被注释掉,文档中就会出现空格(看起来很奇怪,尤其是有部分内容!)

(PS:\ifnum绕行整块街区是行不通的)

有人可以帮忙吗?

非常感谢!

答案1

原始 MWE 的问题在于,acro_num文档开头的计数始终为零,因此测试必然失败。

可以通过将值存储acro_num到文档末尾的另一个计数器.aux(在内\AtEndDocument)并在文档启动时再次读取来绕过此问题,在\AtBeginDocument

一如既往,必须运行 (pdf)latex......

还有一个附加内容(但不是要求的)\listofacronyms,旨在显示在哪个页面上使用了首字母缩略词。

\documentclass[english, a4paper, 10pt]{article}
\usepackage{etoolbox}
%abbreviations
\usepackage[printonlyused]{acronym}

%count acronyms
\usepackage{totcount}
\newtotcounter{acro_num}

\let\oldac=\ac
\renewcommand{\ac}[1]{\stepcounter{acro_num}\oldac{#1}%{
\addcontentsline{lac}{section}{\protect{\textbf{#1}\hspace*{0em}}}%
}%

\newcommand{\ListOfAcronymsname}{List of Acronyms}

\makeatletter
\newcommand\listofacronyms{%
  \section*{\ListOfAcronymsname}    
        \@mkboth{%
           \MakeUppercase\ListOfAcronymsname}{\MakeUppercase\ListOfAcronymsname}%
    \@starttoc{lac}%
    }
\makeatother

\newcommand{\listofabbreviations}{
\ifnumgreater{\number\value{acro_num}}{0}{%
\section*{List of Abbreviations}
\begin{acronym}[12345678]
\setlength{\parskip}{0pt}
\setlength{\partopsep}{0pt}
\setlength{\topsep}{0pt}
\setlength{\parsep}{0pt}
\setlength{\itemsep}{0pt}
  %list of acronyms
  \acro{ABR}{abbreviation}
  \acro{OMG}{Oh my god!}
  \acro{EPR}{Einstein-Rosen-Podolsky}
\end{acronym}
\clearpage
\setcounter{acro_num}{0} % reset the counter
}{%
}%

}%

\newcounter{TotalNumberUsedAcronyms}

\makeatletter
\AtEndDocument{%
\immediate\write\@auxout{%
\string\setcounter{TotalNumberUsedAcronyms}{\number\value{acro_num}}}%
}%


\AtBeginDocument{%
\setcounter{acro_num}{\number\value{TotalNumberUsedAcronyms}}
}


\begin{document}

\tableofcontents
\listofabbreviations

\section{Document Start}

%reset abreviations
\acresetall

%document
\section{Amazing...}

\ac{ABR}
\ac{OMG}
\newpage
\ac{EPR}


There are \arabic{acro_num} acronyms, for example \ac{OMG}


Bla bla...

\end{document}

在此处输入图片描述

答案2

它将有关使用的缩写词的信息写入辅助文件\jobname.acr。如果模式发生变化,则需要多次运行 LaTeX。

\documentclass[english, a4paper, 10pt]{article}
\usepackage[printonlyused]{acronym}
\InputIfFileExists{\jobname.acr}{\def\haveACRO{0}}   
\immediate\openout15=\jobname.acr\relax
\let\oldac=\ac  
\def\ac{%
   \immediate\write15{\string\gdef\string\haveACRO{1}}\oldac} %
\AtEndDocument{\closeout15}
\begin{document}

\section{Document Start}    
\ifnum\haveACRO>0 \section*{List of Abbreviations} \fi
\begin{acronym}[12345678]
  %list of acronyms
  \acro{ABR}{abbreviation}
  \acro{ANC}{African National Congress}
\end{acronym}

\ifnum\haveACRO>0  \clearpage \fi
\acresetall

\section{Amazing...}
\ac{ABR} is working!
\ac{ANC} too
Bla bla...

\end{document}

在此处输入图片描述

答案3

感谢您的快速回答!

事实上,我错了。

解决方案\ifnum整个街区工作,它只需要3 次编译运行

评论:totcount 包计算出现的总次数。这意味着,即使在文档的开头\total{acro_num}(和)也不为 0(当然,假设编译运行足够多,并且文档中\totvalue{acro_num}有一个)。\ac

PS:奇怪的重新定义\ac取自 totcount 的文档;-)
(见总计数文件第2页)

再次感谢。

工作示例:

\documentclass[english, a4paper, 10pt]{article}

%abbreviations
\usepackage[printonlyused]{acronym}

%count acronyms
\usepackage{totcount}
\newtotcounter{acro_num}
\def\oldac{} \let\oldac=\ac
\def\ac{\stepcounter{acro_num}\oldac}

\begin{document}

\section{Document Start}

%list of abbrev
\ifnum\totvalue{acro_num}>0%
\section*{List of Abbreviations}
\begin{acronym}[12345678]
  \setlength{\itemsep}{0pt}
  %list of acronyms
  \acro{ABR}{abbreviation}
\end{acronym}
\clearpage
\fi


%reset abreviations
\acresetall

%document
\section{Amazing...}

%\ac{ABR} is working!

Bla bla...

\end{document}

相关内容