Это нужно для обозначения изменений в файле LaTeX. Допустим, я хочу добавить вертикальную линию в начало строки всякий раз, когда появляется "слово 1", "слово 2", ..." или "слово 100". Это можно сделать вручную, чтобы определить, где появляется "слово 1", но это может быть утомительно, если "слов" много и процесс нужно повторять снова. Так какой же разумный способ сделать это?
I use this as an example to add vertical line
| when word 1 appears and another vertical line
| word 2 appears.
решение1
Я использую адаптацию своего titlecaps
пакета, который обычно используется для заглавия первой буквы каждого слова, заданной строкой слов (с указанными пользователем исключениями). Поэтому вместо заглавия слов я оставляю их без изменений. Однако я использую код, который ищет указанные пользователем исключения, как для размещения правила в левом поле, так и для изменения цвета выделенного слова (эти две функции работают независимо, и одну из них можно отключить, не влияя на другую).
Я использую этот tabto
пакет для облегчения записи строк на полях.
Слова для поиска указываются макросом \WordsToNote{word1 word2 word3}
, списком, разделенным пробелами. Последующие вызовы являются кумулятивными, поэтому \WordsToNote{word1 word2}\WordsToNote{word3}
функционально эквивалентны предыдущему вызову. Список слов можно сбросить с помощью \Resetlcwords
.
Вызов макроса для абзаца — просто \NoteWords{<text>}
.
Как и titlecaps
пакет, он может обрабатывать ограниченное подмножество макровызовов, включая изменение размера текста и изменение стиля.
ОТРЕДАКТИРОВАНО для обработки нескольких абзацев одновременно. ИСПРАВЛЕНО, чтобы новый \par
не выдавался автоматически в конце макроса.
\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}
Обратите внимание: строка, которую \textwidth4in\relax\sloppy
я намеренно поместил в код MWE, чтобы уменьшить поля и устранить переполненные поля. Пожалуйста, удалите их перед использованием этого кода в других местах.