我希望能夠追蹤由多個 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
before \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
我開始在我的碩士論文中使用勘誤表包。然而,我很快就發現它太有限了,所以我開始修改它,基本上最終完全重寫了它。
我在嘗試確保向後相容性的同時對其進行了廣泛的擴展。不幸的是,我從未在 ctan 上發布它,因此目前有必要將套件檔案從 git 儲存庫複製到您的工作目錄中。
請注意,套件的內部結構非常複雜,因此要充分了解如何利用選項並自訂行為,需要對 LaTeX 以及 pkgkeys 套件有充分的了解。
勘誤表修改的資源:
在許多選項中,您可以使用下列選項顯示每個勘誤的頁碼和行號行=真。
我做了一個基於的例子勘誤表.tex來自 Github 存儲庫並嘗試盡可能地刪除它:
\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):