Dies dient dazu, Änderungen in einer LaTeX-Datei anzuzeigen. Angenommen, ich möchte eine vertikale Linie am Zeilenanfang hinzufügen, wenn „Wort 1“, „Wort 2“, …“ oder „Wort 100“ erscheint. Dies kann manuell durchgeführt werden, um festzustellen, wo „Wort 1“ erscheint, es kann jedoch mühsam sein, wenn es viele „Wörter“ gibt und der Vorgang erneut wiederholt werden muss. Wie kann man dies also auf intelligente Weise tun?
I use this as an example to add vertical line
| when word 1 appears and another vertical line
| word 2 appears.
Antwort1
Ich verwende eine Anpassung meines titlecaps
Pakets, die normalerweise verwendet wird, um den ersten Buchstaben jedes Wortes in einer gegebenen Zeichenfolge (mit benutzerdefinierten Ausnahmen) groß zu schreiben. Anstatt Wörter groß zu schreiben, lasse ich sie daher unverändert. Ich verwende jedoch den Code, der nach den benutzerdefinierten Ausnahmen sucht, um sowohl eine Regel in den linken Rand einzufügen als auch die Farbe des hervorgehobenen Wortes zu ändern (diese beiden Funktionen funktionieren unabhängig voneinander und können deaktiviert werden, ohne dass sich dies auf die andere auswirkt).
Ich verwende das tabto
Paket, um die Randliniennotation zu erleichtern.
Die zu suchenden Wörter werden durch das Makro angegeben \WordsToNote{word1 word2 word3}
, eine durch Leerzeichen getrennte Liste. Nachfolgende Aufrufe sind kumulativ, sodass dies \WordsToNote{word1 word2}\WordsToNote{word3}
funktional dem vorherigen Aufruf entspricht. Die Liste der Wörter kann mit zurückgesetzt werden \Resetlcwords
.
Der Makroaufruf für den Absatz lautet einfach \NoteWords{<text>}
: .
Wie das titlecaps
Paket kann es eine begrenzte Teilmenge von Makroaufrufen verarbeiten, einschließlich Änderungen der Textgröße und des Stils.
BEARBEITET, um mehrere Absätze gleichzeitig zu verarbeiten. BEHOBEN, sodass \par
am Ende des Makros nicht automatisch ein „new“ ausgegeben wird.
\documentclass{article}
\usepackage{titlecaps}
\makeatletter
\renewcommand\titlecap[2][P]{%
\digest@sizes%
\if T\converttilde\def~{ }\fi%
\redefine@tertius%
\get@argsC{#2}%
\seek@lcwords{#1}%
\if P#1%
\redefine@primus%
\get@argsC{#2}%
\protected@edef\primus@argi{\argi}%
\else%
\fi%
\setcounter{word@count}{0}%
\redefine@secundus%
\def\@thestring{}%
\get@argsC{#2}%
\if P#1\protected@edef\argi{\primus@argi}\fi%
\whiledo{\value{word@count} < \narg}{%
\addtocounter{word@count}{1}%
\if F\csname found@word\roman{word@count}\endcsname%
\notitle@word{\csname arg\roman{word@count}\endcsname}%
\expandafter\protected@edef\csname%
arg\roman{word@count}\endcsname{\@thestring}%
\else
\notitle@word{\csname arg\roman{word@count}\endcsname}%
\expandafter\protected@edef\csname%
arg\roman{word@count}\endcsname{%
\protect\MPAR\color{red}\@thestring\color{black}{}}%
\fi%
}%
\def\@thestring{}%
\setcounter{word@count}{0}%
\whiledo{\value{word@count} < \narg}{%
\addtocounter{word@count}{1}%
\ifthenelse{\value{word@count} = 1}%
{}{\add@space}%
\protected@edef\@thestring{\@thestring%
\csname arg\roman{word@count}\endcsname}%
}%
\let~\SaveHardspace%
\@thestring%
\restore@sizes%
\un@define}
\makeatother
\usepackage{tabto,xcolor}
\def\margrule{\protect\rule[-\dp\strutbox]{1pt}{\baselineskip}}
\def\MPAR{\protect\tabto*{-.2cm}%
\margrule\protect\tabto*{\TabPrevPos}}
\let\WordsToNote\Addlcwords
\newcommand\NoteWords[1]{\NoteWordsHelp#1\par\relax}
\long\def\NoteWordsHelp#1\par#2\relax{%
\titlecap{#1}%
\ifx\relax#2\else\par\NoteWordsHelp#2\relax\fi%
}
\textwidth4in\relax\sloppy
\begin{document}
\WordsToNote{word1 word2 word3}
\NoteWords{
This is a test of finding word1 and others like word2 and to see if
a marking can be placed in the \textit{margin when they} are found.
I also include word3 in the list. \"Unfortunately, this only does
a single paragraph at a time. \tiny Multiple ocurrences in a
single row only result in a single\normalsize mark, with this word1 implementation.
For my second paragraph,
this is a test of finding word1 and others like word2 and to see if
a marking can be placed in the \textit{margin when they} are found.
I also include word3 in the list. \"Unfortunately, this only does
a single paragraph at a time. \tiny Multiple ocurrences in a
single row only result in a single\normalsize mark, with this word1 implementation.
}
Look Mom, no new paragraph.
\end{document}
Bitte beachten: Die Zeile \textwidth4in\relax\sloppy
habe ich absichtlich in den MWE-Code eingefügt, um die Ränder zu verkleinern und überfüllte Boxen zu vermeiden. Bitte entfernen Sie sie, bevor Sie diesen Code an anderen Orten verwenden.