Пусть покупатель будет бдителен ...

Пусть покупатель будет бдителен ...

Я хотел бы иметь возможность отслеживать ошибки в диссертации, состоящей из нескольких файлов 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 находится строка 1023 или что-то в этом роде. Если исправлений много, это, вероятно, можно контролировать, но если исправлений на странице мало, номер строки будет почти бесполезен.

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.

Ресурсы для исправления ошибок:

Среди множества опций вы можете отобразить номер страницы и номер строки для каждой ошибки с помощью опциильнонос=истина.

Я привел пример на основеerratatest.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):введите описание изображения здесь

Связанный контент