买者自负 ...

买者自负 ...

我希望能够跟踪由多个 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 页如下所示:

第 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。例如,许多论文在切换到阿拉伯语之前,在“前言”中使用小写罗马数字。这需要非常小心,并且可能需要在文档中的不同类型的行号之间切换 - 甚至在考虑使其与 配合使用之前也是如此erratalineno有关其功能和缺陷的更多详细信息,请参阅 的文档。

完整代码:

\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):在此处输入图片描述

相关内容