我希望能够跟踪由多个 LaTeX 文件组成的论文中的勘误表,然后将它们显示在单独的文档中。使用errata
包我可以做这样的事情:
thebook.tex
:
\documentclass{article}
\usepackage[hide, record]{errata}
\title{The Book}
\begin{document}
\maketitle
\section{First section}
I misspelled a \erratumReplace{misspelled `word'}{ord}{word} on this line.
\section{Second section}
... and also on this \erratumReplace{misspelled `line'}{ine}{line}.
\end{document}
theerrata.tex
:
\documentclass{article}
\usepackage[hide]{errata}
\title{Errata in The Book}
\begin{document}
\maketitle
\printerrata{thebook}
\end{document}
这给了我:
有什么方法可以打印出每份勘误表的页码和章节/小节?errata
文档说:
它们的位置将由它们出现的部分而不是页码来引用,因为我们不希望前者在勘误表校正过程中发生变化。
但是,在我的特定情况下,我需要更多关于每个勘误表的位置信息 - 至少是页码,如果可能的话,还有行号。有没有办法使用errata
或其他包来实现这一点?
答案1
我认为不可能说服该软件包立即执行此操作。但是,我们可以修补它用来创建勘误表引用的命令,并在激活-errata.tex
时将其写入文件。record
例如,使用etoolbox
,我们可以将页码添加到章节信息中,如下所示:
\documentclass{article}
\usepackage[hide, record]{errata}
\usepackage{etoolbox}
\apptocmd\ErratumRef{: p.~\arabic{page}}{\typeout{Successfully added pages to errata references.}}{\typeout{Oh no! Could not add pages to errata references. Patch failed!}}
\title{The Book}
\begin{document}
\maketitle
\section{First section}
I misspelled a \erratumReplace{misspelled `word'}{ord}{word} on this line.
\clearpage
No errors here!
\clearpage
\section{Second section}
\dots and also on this \erratumReplace{misspelled `line'}{ine}{line}.
\end{document}
我稍微扩展了 MWE,只是为了测试我没有得到所有页码都等于 1 或等于当前节号之类的东西。以上生成以下-errata.tex
文件:
\erratumItem{{}1: p.\nobreakspace {}1}{misspelled `word'}
\erratumItem{{}2: p.\nobreakspace {}3}{misspelled `line'}
当勘误表
\documentclass{article}
\usepackage[hide]{errata}
\title{Errata in The Book}
\begin{document}
\maketitle
\printerrata{<filename of The Book>}
\end{document}
经过处理,产生
行号非常棘手,远远超出了此答案作者的知识范围。虽然我以前从未使用过它,但这个lineno
包在这里可能会有所帮助。
买者自负 ...
该软件包提供了各种选项,但并非所有选项都可能适合我们的目的。最可靠的选项可能是简单地使用默认选项加载软件包,然后说\linenumbers
之前\maketitle
。
在这种情况下,原始文档的第 1 页和第 3 页如下所示:
我们可以修改我们的补丁
\apptocmd\ErratumRef{: p.~\arabic{page}: l.~\arabic{linenumber}}{\typeout{Successfully added pages to errata references.}}{\typeout{Oh no! Could not add pages to errata references. Patch failed!}}
在勘误表中生成以下内容
如果我们不想在原始文档中显示行号,我们可以添加
\let\makeLineNumber\relax
并且勘误表的引用仍会选择行号。但是,这将使行号的用处大大减少,因为我们将不得不猜测第 54 页第 1,023 行在哪里或其他什么。如果勘误表很多,这可能是可以管理的,但如果页面上的勘误表很少,行号几乎毫无用处。
lineno
支持重置每页的页码。但是,这不会直接与 配合使用errata
。此外,典型的论文不太可能满足此选项所规定的条件lineno
。例如,许多论文在切换到阿拉伯语之前,在“前言”中使用小写罗马数字。这需要非常小心,并且可能需要在文档中的不同类型的行号之间切换 - 甚至在考虑使其与 配合使用之前也是如此errata
。lineno
有关其功能和缺陷的更多详细信息,请参阅 的文档。
完整代码:
\documentclass{article}
\usepackage[hide, record]{errata}
\usepackage{etoolbox}
\usepackage{lineno}
\apptocmd\ErratumRef{: p.~\arabic{page}: l.~\arabic{linenumber}}{\typeout{Successfully added pages to errata references.}}{\typeout{Oh no! Could not add pages to errata references. Patch failed!}}
\title{The Book}
\begin{document}
\linenumbers
\maketitle
\section{First section}
I misspelled a \erratumReplace{misspelled `word'}{ord}{word} on this line.
\clearpage
No errors here!
\clearpage
\section{Second section}
\dots and also on this \erratumReplace{misspelled `line'}{ine}{line}.
\end{document}
勘误表文档的代码仍然如上所列。
答案2
我开始使用 errata 包来完成我的硕士论文。但是,我很快发现它的功能太有限了,所以我开始修改它,最后基本上完全重写了它。
我对其进行了广泛的扩展,同时尝试确保向后兼容性。不幸的是,我从未在 ctan 上发布过它,因此目前需要将包文件从 git repo 复制到您的工作目录中。
请注意,包内部非常复杂,因此要完全理解如何使用选项和自定义行为需要对 LaTeX 以及 pkgkeys 包有很好的理解。
勘误表修改的资源:
在许多选项中,您可以使用以下选项显示每个勘误表的页码和行号linenos=true。
我根据以下示例进行了说明勘误表.tex来自 Github repo 并尝试尽可能地精简它:
\documentclass[a4paper,12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[margin=1.6in,marginparsep=3mm]{geometry}
\usepackage{pgfkeys}
\usepackage{caption}
\usepackage{etoolbox}
\usepackage{etextools}
\usepackage{xparse}
\usepackage{tcolorbox}
\usepackage{marginnote}
% Needed for line numbers
\usepackage{lineno}
\setpagewiselinenumbers
\linenumbers
% Remove the line numbers in the margin when using the lineno package
\renewcommand{\LineNumber}{}
\usepackage[bookmarks,breaklinks,pdfpagelabels,
colorlinks=true, % Colors links instead of ugly boxes
linkcolor=black, % Color of internal links
]{hyperref}[2012/11/06] % Reference package, must be before cleveref
\usepackage[noabbrev,nameinlink]{cleveref}[2013/12/28]
\usepackage[
margins=true,
foots=true,
record=true,
linenos=true,
defaultargs={margin=true,foot=true},
defaultargsnote={inlinechange=false},
%requirecmddescription=false,
%marginnote=false,
marginnote=true,
uniquelistlabels=0,
inlinemarks=false,
%inlinechanges=false,
inlinemarks=true,
styles={tablelist},
]{errata}[2015/04/16]
% change margin node format to use tcolorbox
\errataSetKeyFormat[#1+#2]{marginfmt/marginnote}{%
{\vspace{-4pt}%
\begin{tcolorbox}[size=fbox,nobeforeafter,
colframe=red!50!white,colback=red!25!yellow!5!white,%
fontupper=\scriptsize,%
bottomrule=1pt,toprule=1pt,leftrule=0pt,rightrule=0pt,
% arc=0cm, outer arc=0mm, % Remove the rounded corners
arc=0cm,
outer arc=0mm, % Remove the rounded corners
code={\pgfkeysalsofrom#1}
]#2\end{tcolorbox}}}%
\makeatletter
% Example on changing the table styling
\errataset{%
customliststyletablekeyformats/.style={%
listformats/lineref/.setStrKeyFmt={##1}{~(L \lineref{##1})},
%%
listformats/erratalistbegin/.setStrKeyFmt={##1}{%
\setlength\LTleft{-1cm}
\setlength\LTright{-1cm}
\makeatletter%
\begin{longtable}{ c@{\tcolsep{1.7}} c@{\tcolsep{2}} c p{15em} l c }%
& Title & Type & Action & Page
},
listformats/erratalistend/.setStrKeyFmt={##1}{\end{longtable}\makeatother},
actionformat/replace/.setStrKeyFmt={##1+##2}{##2 \shortarrow ##1},
actionformat/add/.setStrKeyFmt={##1}{##1},
actionformat/delete/.setStrKeyFmt={##1}{##1},
actionformat/note/.setStrKeyFmt={##1}{ ##1},
footformats/description/.setStrKeyFmt={##1}{~[##1]~},
footformats/erratumcustomlocation/.setStrKeyFmt={##1+##2}{~[P:\pageref{##1} (L \lineref{##2})]},
listformats/erratumcustomlocation/.setStrKeyFmt={##1+##2}{\pageref{##1} (L \lineref{##2})},
setCmdKeyArgsGetTwo={erratumcustomlocation}{##1+##2}{{pageref}+{lineref}},
},
customliststylefortable/.code={
\errataSetListFormat{+erratumlistitemtitle,+erratumlisttarget,%
\noexpand\errataamersand,+erratumnamedlink,\noexpand\errataamersand,%
+action,\noexpand\errataamersand,+actiondescription,\noexpand\errataamersand,%
-erratumcustomlocation}%
\errataSetFootFormat{+description, +actiondescription, -erratumcustomlocation}
\setcounter{@errata@uniquelistlabels}{4}
\usepackage{stmaryrd}
\newcommand{\shortarrow}{\ensuremath{\vrule height 2\fontdimen22\textfont2 width 0pt\shortrightarrow}}
\newcommand{\tcolsep}[1]{\hspace{##1em}}
\errataRegisterFormatKey{erratumcustomlocation}
},
styles/customtablelist/.style={styles/tablelist, customliststyletablekeyformats,
customliststylefortable},
}
% Apply the custom table style with line numbers in errata
\errataset{.errataapplystyles/.list={customtablelist}}
\makeatother
\title{The Book}
\begin{document}
\section{First section}\label{sect:first}
I misspelled a \erratumReplace{typo}{ord}{word} on this line.
\section{Second section}
... and also on this \erratumReplace[margin=false]{typo}{ine}{line}, but hide
the note in the margin.
On this line we \erratumReplace[inlinemark=false,
label={typolabel}]{typo}{fixes}{fix} a typo and hide the inline marking, but we
still find \cref{typolabel} in the \cref{chap:errata}.
\section{Third section}
Here we \erratumAdd[foot=false]{add}{add} a word without a footnote comment.
\section{Errata}\label{chap:errata}
\PrintErrata
\end{document}
如下所示(PDF):