来自 blockquotes 和 octavo 类的重复条目

来自 blockquotes 和 octavo 类的重复条目

下面的代码会在词汇表中生成重复的条目,即使它只定义了一次。

没有必要运行 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

在这种情况下,全局内部整数仍会被提升,因此会跳过一个数字,但这不会产生问题。

我已经在enotezbugtracker 上打开了一个问题(https://bitbucket.org/cgnieder/enotez/issues/13/should-endnotes-obey-if-filesw) 来询问是否有用enotez服从\if@filesw

相关内容