下面的代码会在词汇表中生成重复的条目,即使它只定义了一次。
没有必要运行 makeindex。只需运行两次 pdflatex。
使用了该包csquotes
。使用后出现问题enotez
。
可以修复吗或者这是一个错误?
\documentclass[foolscap,10pt,openright]{octavo}
%Preamble
\makeatletter
%\def\input@path{{./}{./octavo}}
\makeatother
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[portuguese]{babel}
\usepackage{bibref,autind}
%Bibliografia
\usepackage[fixlanguage]{babelbib}
\selectbiblanguage{brazil}
\setbtxfallbacklanguage{portuguese}
\usepackage[version=4]{mhchem} %For chemical equations
\usepackage{lettrine}
% Optical margins, kerning etc.
\usepackage[
activate={true,nocompatibility},
final,
tracking=true,
kerning=true,
spacing=true,
babel=true,
]{microtype}
%\usepackage{xspace}
\usepackage{emptypage}
\usepackage{enotez}
\usepackage[
autostyle=false,
csdisplay=true,
threshold=1,
thresholdtype=words,
csdisplay=true,
]{csquotes}
% Decrease font size when quoting
\usepackage{relsize,etoolbox}
\usepackage{lipsum}
\AtBeginEnvironment{quote}{\smaller}
\AtBeginEnvironment{quotation}{\smaller}
%Insert () for endnotes
\renewcommand\enmark{\textsuperscript{(\theenmark)}}
\DeclareInstance{enotez-list}{custom}{paragraph}
{
heading = \chapter{Glossário},
notes-sep = 0pt,
format = \normalfont,
number = \textsuperscript{(#1)}
}
\newcommand{\nomedepgm}[1]{\textsf{\smaller #1}}% Used with program names
% Nice for pages like \putoncenter{The end}
\newcommand{\putoncenter}[1]{%
\cleardoublepage
\thispagestyle{empty}
\vspace*{\fill}
\begin{center}
\scshape #1
\end{center}
\vspace*{\fill}
}
% New index
\newindex{idenomes}{ndx}{nnx}{\'{I}ndice de nomes}
%\index[idenomes]{John7 Doe1}
% fix the headers
\patchcmd{\tableofcontents}{\MakeUppercase}{}{}{}
\patchcmd{\tableofcontents}{\MakeUppercase}{}{}{}
\patchcmd{\theindex}{\MakeUppercase}{}{}{}
\patchcmd{\theindex}{\MakeUppercase}{}{}{}
\patchcmd{\thebibliography}{\MakeUppercase}{}{}{}
\patchcmd{\thebibliography}{\MakeUppercase}{}{}{}
\newcommand*{\abbrev}[1]{\textls[40]{\textsc{#1}}}
\usepackage{ebgaramond}
\begin{document}
\tableofcontents
\chapter{Prefácio}
This text contains both
endnotes\endnote{\emph{End notes}, in this specific case, is supposed to be a glossary.} and
footnotes\footnote{This is a footnote, not an end note.}.
I cannot distinguish one from another.
Here comes some dummy text with an endnote:%:
\blockquote{%
This is latin\endnote{\emph{Latin} is an old language.}:
\lipsum[75]
}
Now go to the glossary and you will see the duplicated entry generated from within the blockquote.
I'll add just some dummy text and another endnote%
\endnote{\emph{Lorem ipsum} is dummy text used in laying out print, graphic or web designs.}.
This one is correct, not duplicated.
\cleardoublepage
\backmatter
%Bibliography
\bibliographystyle{unsrt}
\bibliography{biblatex-examples.bib}
%I used a kind of glossary, but like a chapter
\printendnotes[custom]
% Here comes a name index
\printindex[idenomes]
\end{document}
答案1
以下缩写的 MWE 重现了该问题
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{enotez}
\renewcommand*\enotezwritemark[1]{\textsuperscript{(#1)}}
\usepackage{csquotes}
\usepackage{lipsum}
\begin{document}
endnote\endnote{End note one.} and
footnotes\footnote{Regular footnote one.}.
Here comes some dummy text with an endnote:
\blockquote{%
Footnote\footnote{Single footnote} endnote\endnote{Double endnote}
\lipsum[75]}
Fn\footnote{Footnote two}
En\endnote{Endnote three}
\printendnotes
\end{document}
我会让csquotes
文档解释为什么会发生这种情况(第 37-38 页):
大块引用功能需要对所有引用进行两次排版。第一次排版用于测量引用的长度。实际排版在第二次排版时进行,其格式取决于第一次排版的结果。
csquotes
采取一些措施来避免实际上执行相同代码两次的不良副作用,但并非所有不良副作用都可以通过这种方式避免。
乍一看,我无法找出哪些enotez
实施部分导致其命令不被csquotes
保护措施重置。
在这种情况下,您可以使用\BlockquoteDisable
暂时禁用有问题的命令(文档第 38 页csquotes
)。
如果您发现与试用相关的任何故障(例如,如果计数器增加两次或某个项目在列表中出现两次),请使用
\BlockquoteDisable
重新定义或暂时禁用受影响的命令。
\BlockquoteDisable{%
\renewcommand{\endnote}[2][]{}%
}
这意味着\endnote
在第一次测量时将被忽略blockquote
。事实上,将这些线添加到 MWE 中,我们得到
编辑
来自csquotes
手册
为了防止第一次(试验)传递的任何副作用,该
csquotes
包 (1) 在组内执行第一次传递,(2) 使用检查点冻结所有 LaTeX 计数器,以及 (3) 设置\if@filesw
为 false。但是,它无法防止由以下命令引起的副作用:(1) 进行任何在第二遍传递中未被覆盖的全局分配(例如,通过),(2) 以绕过 LaTeX 计数器命令的方式全局增加计数器,或 (3)每次写入辅助文件时\g@addto@macro
不进行检查。\if@filesw
事实证明,在写入文件时enotez
不遵守。因此,这个问题也可以通过以下方法解决\if@filesw
.aux
\makeatletter
\ExplSyntaxOn
\cs_set_protected:Npn \enotez_save_note:nnnnnnn #1#2#3#4#5#6#7
{ \if@filesw\iow_now:Nn \@auxout { \enotez@note {#1} {#2} {#3} {#4} {#5} {#6} {#7} }\fi }
\ExplSyntaxOff
\makeatother
在这种情况下,全局内部整数仍会被提升,因此会跳过一个数字,但这不会产生问题。
我已经在enotez
bugtracker 上打开了一个问题(https://bitbucket.org/cgnieder/enotez/issues/13/should-endnotes-obey-if-filesw) 来询问是否有用enotez
服从\if@filesw
。