在下面的代码中,尽管使用了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}
那么顺序就正确了。