为什么会发生这种情况?

为什么会发生这种情况?

在下面的代码中,尽管使用了withpage选项,但虚线和页码并未显示在输出 PDF 中。我该如何解决这个问题?

\documentclass{book}
\usepackage[colorlinks]{hyperref}
\usepackage[printonlyused,withpage]{acronym}
\usepackage{xepersian} % http://ctan.org/pkg/xepersian
\begin{document}
\chapter{تست}
\section{تست}
تست
\ac{GSM} 
\section{نمادها}
\begin{acronym}
\acro{GSM}[$G_sm$]{مجموعه فلان}
\end{acronym}
\end{document}

请注意,代码应使用 运行xelatex

答案1

为什么会发生这种情况?

在您的.aux文件中,三个相关的宏应按以下顺序出现:

\undonewlabel
\newlabel
\acronymused

当方向为 LTR 时,顺序是正确的,但是当方向为 RTL 时,顺序会被反转,因此您将得到:

\acronymused
\newlabel
\undonewlabel

这就是问题的根源。

更多主要分析

\documentclass{article}
\makeatletter
\def\test{%
\protected@write\@auxout{}{\string\large}%
\protected@write\@auxout{}{\string\Large}%
\protected@write\@auxout{}{\string\Huge}%
}
\makeatother
\begin{document}
This is a test \test
\end{document}

文件中的一个.aux,应该得到:

\large
\Large
\Huge

但是,当您启用TeX--XeT

\documentclass{article}
\makeatletter
\def\test{%
\protected@write\@auxout{}{\string\large}%
\protected@write\@auxout{}{\string\Large}%
\protected@write\@auxout{}{\string\Huge}%
}
\makeatother
\TeXXeTstate=1
\begin{document}
This is a test \beginR\test\endR
\end{document}

文件中的顺序将被反转.aux

\Huge
\Large
\large

这只是颠倒了顺序。请注意,这只会在水平模式下发生。我认为这是一个etex错误或一个非常糟糕的功能(如果不是错误的话)。

解决方法是什么?

这应该在引擎内部修复;在宏观层面,可以将它们以 RTL 中的反向顺序放置,这样当它被反转时,它将处于正确的顺序。请注意,宏观层面的解决方案只是暂时的,并不可靠;这里有这样的解决方法:

\documentclass{book}
\usepackage[colorlinks]{hyperref}
\usepackage[printonlyused,withpage]{acronym}
\usepackage{xepersian} % http://ctan.org/pkg/xepersian
\makeatletter
\renewcommand*\@verridelabel[1]{%
  \@bsphack
  \label{#1}%
  \protected@write\@auxout{}{\string\undonewlabel{#1}}%
  \@overriddenmessage rs{#1}%
  \@esphack
}%
\renewcommand*{\@acf}[1]{%
      \ifAC@starred\else\AC@logged{#1}\fi%
       \acffont{%
          \AC@placelabel{#1}\hskip\z@\AC@acl{#1}%
          \nolinebreak[3] %
          \acfsfont{(\acsfont{\AC@acs{#1}})}%
        }}
\makeatother
\begin{document}
\chapter{تست}
\section{تست}
تست
\ac{GSM} 
\section{نمادها}
\begin{acronym}
\acro{GSM}[$G_sm$]{مجموعه فلان}
\end{acronym}
\end{document}

答案2

仅使用一个似乎更合乎逻辑\protected@write

\documentclass{article}
\makeatletter
\def\test{%
\protected@write\@auxout{}{%
\string\large^^J%
\string\Large^^J%
\string\Huge%
}}
\makeatother
\TeXXeTstate=1
\begin{document}
This is a test \beginR\test\endR
\end{document}

那么顺序就正确了。

相关内容