
Помогите, пожалуйста: я редактирую .tex
файл (класс мемуаров) с большим объемом текста и хочу собрать предложения, такие как важные вопросы, цитаты, слова и т. д., объединить их в соответствующие группы и поместить в конец книги.
Например:
.tex
файл
\chapter{xyz}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam metus massa, molestie elementum tincidunt at, mollis et quam.
\collectQuestion{Donec viverra posuere lorem, ac sagittis eros tincidunt interdum?}
Phasellus feugiat id justo at pretium.
Duis sed commodo velit. \collectPhrase{Cras tempus} fermentum leo, ac congue nisl convallis vel.
\chapter{abc}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam metus massa, molestie elementum tincidunt at, mollis et quam.
Donec viverra posuere lorem, ac sagittis eros tincidunt interdum.
Phasellus feugiat id justo at pretium. \collectQuestion{Sed placerat sodales lorem sed sodales?}
Duis sed commodo velit. Cras tempus fermentum leo, \collectPhrase{ac congue nisl} convallis vel.
.pdf
файл . . .
Вопросы?
- Donec viverra posuere lorem, ac sagittis eros tincidunt interdum?..pg x
- Sed placerat sodales lorem sed sodales?.................................................стр. y
Фразы:
- Cras tempus (стр. x)
- ac congue nisl (pg y)
решение1
Пожалуйста, простите мне легкую иронию:
«Класс мемуаров», который является базовым руководством пользователя мемуаров и содержит всего 611 страниц, говорит, что можно сделать что-то вроде этого:
\documentclass{memoir}
%\usepackage{hyperref}
\newcommand{\listofphrasesname}{Phrases:}%
\newlistof{listofphrases}{phr}{\listofphrasesname}%
\newlistentry{phrase}{phr}{0}%
\cftpagenumbersoff{phrase}%
%
\newcounter{phrases}
\renewcommand{\thephrases}{\arabic{phrases}.}
\newcommand{\collectPhrase}[1]{%
#1%
\stepcounter{phrases}%
\addcontentsline{phr}{phrase}{\protect\numberline{\thephrases}#1~(pg~\thepage)}%
}
\newcommand{\listofquestionsname}{Questions?}%
\newlistof{listofquestions}{qst}{\listofquestionsname}%
\newlistentry{question}{qst}{0}%
\cftpagenumberson{question}%
%
\newcounter{questions}
\renewcommand{\thequestions}{\arabic{questions}.}
\newcommand{\collectQuestion}[1]{%
#1%
\stepcounter{questions}%
\addcontentsline{qst}{question}{\protect\numberline{\thequestions}#1}%
}
\makeatletter
\newlength\mypagenumwidth
\settowidth\mypagenumwidth{\@nameuse{cftquestionpagefont}pg~\hb@xt@\@pnumwidth{}}%
\renewcommand\cftquestionformatpnumhook[4]{%
\hb@xt@\mypagenumwidth{\hfil\@nameuse{cftquestionpagefont}pg~#1}%
}%
\makeatother
\begin{document}
\tableofcontents
\chapter{xyz}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
metus massa, molestie elementum tincidunt at, mollis et
quam. \collectQuestion{Donec viverra posuere lorem, ac sagittis
eros tincidunt interdum?} Phasellus feugiat id justo at pretium.
Duis sed commodo velit. \collectPhrase{Cras tempus} fermentum
leo, ac congue nisl convallis vel.
\chapter{abc}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
metus massa, molestie elementum tincidunt at, mollis et
quam. Donec viverra posuere lorem, ac sagittis eros tincidunt
interdum. Phasellus feugiat id justo at
pretium. \collectQuestion{Sed placerat sodales lorem sed
sodales?} Duis sed commodo velit. Cras tempus fermentum leo,
\collectPhrase{ac congue nisl} convallis vel.
\cleardoublepage
\listofquestions*
\listofphrases*
\end{document}
В качестве альтернативы вы можете сделать что-то, что отслеживает ширину номера вопроса/фразы/страницы и сохраняет ширину самого широкого номера вопроса/фразы/номера страницы в метку, из которой ее можно будет извлечь в будущих запусках LaTeX для установки \cftqestionnumwidth
ширины \cftphrasenumwidth
, \hbox
содержащей номер страницы:
\documentclass{memoir}
%\usepackage{hyperref}
\makeatletter
\newcommand{\listofphrasesname}{Phrases:}%
\newlistof{listofphrases}{phr}{\listofphrasesname}%
\newlistentry{phrase}{phr}{0}%
\cftpagenumbersoff{phrase}%
%
\newcounter{phrases}
\renewcommand{\thephrases}{\arabic{phrases}.}
\newlength\maxphrasenumwidth
\setlength\maxphrasenumwidth{0pt}%
\newcommand{\collectPhrase}[1]{%
#1%
\stepcounter{phrases}%
\begingroup
\settowidth{\@tempdima}{\@nameuse{cftphrasepagefont}\thephrases~}%
\ifdim\@tempdima>\maxphrasenumwidth
\setlength\maxphrasenumwidth\@tempdima
\global\maxphrasenumwidth\maxphrasenumwidth
\fi
\endgroup
\addcontentsline{phr}{phrase}{%
\protect\numberline{\protect\hfill\thephrases\protect~}%
#1\protect~(pg\protect~\thepage)%
}%
}
\AtBeginDocument{%
\@ifundefined{r@maxphrasenumwidth}{%
\settowidth\cftphrasenumwidth{\@nameuse{cftphrasepagefont}100.~}%
}{%
\setlength\cftphrasenumwidth{\r@maxphrasenumwidth}%
}%
}%
\AtEndDocument{%
\immediate\write\@auxout{%
\string\newlabel{maxphrasenumwidth}{\the\maxphrasenumwidth}%
}%
}%
\newlength\mypagenumwidth
\newlength\mypagenumsep
\newcommand{\listofquestionsname}{Questions?}%
\newlistof{listofquestions}{qst}{\listofquestionsname}%
\newlistentry{question}{qst}{0}%
\cftpagenumberson{question}%
\newcounter{questions}
\renewcommand{\thequestions}{\arabic{questions}.}
\newlength\maxquestnumwidth
\setlength\maxquestnumwidth{0pt}%
\newlength\maxpagenumwidth
\setlength\maxpagenumwidth{0pt}%
\newcommand{\collectQuestion}[1]{%
#1%
\stepcounter{questions}%
\begingroup
\settowidth{\@tempdima}{\@nameuse{cftquestionpagefont}\thequestions~}%
\ifdim\@tempdima>\maxquestnumwidth
\setlength\maxquestnumwidth\@tempdima
\global\maxquestnumwidth\maxquestnumwidth
\fi
\settowidth{\@tempdima}{\@nameuse{cftquestionpagefont}pg~\thepage}%
\ifdim\@tempdima>\maxpagenumwidth
\setlength\maxpagenumwidth\@tempdima
\global\maxpagenumwidth\maxpagenumwidth
\fi
\endgroup
\addcontentsline{qst}{question}{%
\protect\numberline{\protect\hfill\thequestions\protect~}#1%
}%
}%
\AtBeginDocument{%
\settowidth\mypagenumsep{\@nameuse{cftquestionpagefont}m}%
\setlength\mypagenumsep{1.5\mypagenumsep}%
\@ifundefined{r@maxquestnumwidth}{%
\settowidth\cftquestionnumwidth{\@nameuse{cftquestionpagefont}100.~}%
}{%
\setlength\cftquestionnumwidth{\r@maxquestnumwidth}%
}%
\@ifundefined{r@maxpagenumwidth}{%
\settowidth\mypagenumwidth{%
\@nameuse{cftquestionpagefont}pg~\hb@xt@\@pnumwidth{}%
}%
}{%
\setlength\mypagenumwidth{\r@maxpagenumwidth}%
}%
\cftinsertcode{questionrightadjust}{%
\setpnumwidth{\mypagenumwidth}%
\setrmarg{\dimexpr\mypagenumsep+\mypagenumwidth\relax}%
}%
\cftinserthook{qst}{questionrightadjust}%
}%
\AtEndDocument{%
\immediate\write\@auxout{%
\string\newlabel{maxquestnumwidth}{\the\maxquestnumwidth}%
}%
\immediate\write\@auxout{%
\string\newlabel{maxpagenumwidth}{\the\maxpagenumwidth}%
}%
}%
\renewcommand\cftquestionformatpnumhook[4]{%
\hb@xt@\mypagenumwidth{\@nameuse{cftquestionpagefont}pg~#1\hfil}%
%\hb@xt@\mypagenumwidth{\@nameuse{cftquestionpagefont}pg\hfil#1}%
%\hbox{\@nameuse{cftquestionpagefont}pg~#1}%
}%
\makeatother
\begin{document}
\tableofcontents
\chapter{xyz}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
metus massa, molestie elementum tincidunt at, mollis et
quam. \collectQuestion{Donec viverra posuere lorem, ac sagittis
eros tincidunt interdum?} Phasellus feugiat id justo at pretium.
Duis sed commodo velit. \collectPhrase{Cras tempus} fermentum
leo, ac congue nisl convallis vel.
\chapter{abc}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
metus massa, molestie elementum tincidunt at, mollis et
quam. Donec viverra posuere lorem, ac sagittis eros tincidunt
interdum. Phasellus feugiat id justo at
pretium. \collectQuestion{Sed placerat sodales lorem sed
sodales?} Duis sed commodo velit. Cras tempus fermentum leo,
\collectPhrase{ac congue nisl} convallis vel.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\collectPhrase{ac congue nisl}.
\newpage\setcounter{page}{1000}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
metus massa, molestie elementum tincidunt at, mollis et quam.
\collectQuestion{Sed placerat sodales lorem sed
sodales?} \collectPhrase{Cras tempus} fermentum
leo, ac congue nisl convallis vel.
\cleardoublepage
\listofquestions*
\listofphrases*
\end{document}
решение2
Если вы хотите записать вопросы и фразы в конце, в том порядке, в котором они появились:
\documentclass[a4paper]{memoir}
\usepackage{xparse}
\makeatletter
\newcommand{\mdotfill}[1][1em]{%
\leavevmode
\linebreak[0]%
\mbox{}\nobreak
\cleaders \hb@xt@ .44em{\hss.\hss}\hskip #1 plus 1fill
\kern\z@
}
\makeatother
\ExplSyntaxOn
\NewDocumentCommand{\collectQuestion}{m}
{
\naib_collect:Nnn \g_naib_collect_question_seq { #1 } { \mdotfill }
}
\NewDocumentCommand{\collectPhrase}{m}
{
\naib_collect:Nnn \g_naib_collect_phrase_seq { #1 } { \nobreakspace }
}
\NewDocumentCommand{\printQuestions}{}
{
\begin{enumerate}
\seq_use:Nn \g_naib_collect_question_seq {}
\end{enumerate}
}
\NewDocumentCommand{\printPhrases}{}
{
\begin{enumerate}
\seq_use:Nn \g_naib_collect_phrase_seq {}
\end{enumerate}
}
\int_new:N \g_naib_collect_int
\seq_new:N \g_naib_collect_question_seq
\seq_new:N \g_naib_collect_phrase_seq
\cs_new_protected:Nn \naib_collect:Nnn
{
\int_gincr:N \g_naib_collect_int
\label{ naib @ \int_to_roman:n { \g_naib_collect_int } }
\naib_collect_append:Nenn
#1
{ naib @ \int_to_roman:n { \g_naib_collect_int } } % the generated label
{ #2 } % the text
{ #3 } % the separation
}
\cs_new_protected:Nn \naib_collect_append:Nnnn
{
\seq_gput_right:Nn #1 { \naib_collect_print:nnn {#2}{#3}{#4} }
}
\cs_generate_variant:Nn \naib_collect_append:Nnnn { Ne }
\cs_new_protected:Nn \naib_collect_print:nnn
{
\item #2#3(pg.\nobreakspace\pageref{#1})
}
\ExplSyntaxOff
\begin{document}
\chapter{xyz}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam metus massa, molestie elementum
tincidunt at, mollis et quam.\collectQuestion{Donec viverra posuere lorem, ac sagittis eros tincidunt
interdum feugiat?} Phasellus feugiat id justo at pretium. Duis sed commodo velit.\collectPhrase{Cras
tempus} fermentum leo, ac congue nisl convallis vel.
\chapter{abc}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam metus massa, molestie elementum
tincidunt at, mollis et quam. Donec viverra posuere lorem, ac sagittis eros tincidunt interdum.
Phasellus feugiat id justo at pretium. \collectQuestion{Sed placerat sodales lorem sed sodales?} Duis
sed commodo velit. Cras tempus fermentum leo, \collectPhrase{ac congue nisl} convallis vel.
\chapter{QP}
\section{Questions}
\printQuestions
\section{Phrases}
\printPhrases
\end{document}