Как здесь работает \expandafter? code
Необходимо выполнить следующее. Я предполагаю, что некоторые из вас смогут сделать это с легкостью, надеюсь.
Цель состоит в том, чтобы распространить букву n
(или любую другую, for Notes
of pagenote
в index
) с pagenotenumber
for \index[]{}
внутри \pagenote{}
.
Это code
происходит от
\index внутри сноски: Как правильно передать номер сноски с помощью пакета index?
\documentclass{report}
\usepackage{index}
\usepackage[texindy,splitindex]{imakeidx}
\usepackage[hidelinks]{hyperref}
\usepackage[page]{pagenote}
\newcommand\pn[2]{\hyperpage{#2}n#1}
\makeatletter
\let\if@nopnote\iffalse % just for the example
\newcommand{\is}[2]{%
\if@nopnote
\index[#1]{#2}%
\else
\expandafter\pagenoteindex\expandafter{\tempnumber}{#2}%
\fi
}
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
{\normalfont #1.} }
\makeatother
\newcommand{\pagenoteindex}[3]{\index[#1]{#3|pn{#2}}}
\makeindex[program=texindy,name=Names,title=Names]
\makeindex[program=texindy,name=Something,title=Something]
\makepagenote
\begin{document}
First index.\index[Something]{First index}
Sentence.\pagenote{First pagenote without index.}
\clearpage
Emph index.\index[Something]{Emph index@\emph{Emph index}}
pagenote and index.\pagenote{Second pagenote with index.\is[Something]{Index inside second pagenote}}
\clearpage
Third pagenote.\pagenote{\emph{Emph index word}.\is[Something]{Emph index@\emph{Emph index}}}
Namenindex\index[Names]{Namenindex}
\printnotes
\printindex[Something]
\printindex[Names]
\end{document}
Эта функциональность кажется стандартной функцией индексации в современном наборе книг, но пока не распознается LaTeX. Было бы здорово, если бы кто-то мог поддержать это и представить решение.
решение1
Не совсем понимаю, чего вы хотите. (Я смутно помню из предыдущих вопросов, но в этом вопросе особо нечего освежить в памяти.)
Следующий код генерирует заметки и номера страниц в индексах, не изменяя содержимое среды document
. Является ли это целевым поведением, я не уверен.
Первоначальная проблема с вашим кодом заключается в том, что вы определили, \pagenoteindex
что требуется 3 аргумента, но передаете только 2. Я предполагаю, что вам здесь нужен необязательный аргумент, потому что вы передаете один \is
, поэтому нам нужно 4 случая, а не 2:
- мы находимся внутри примечания к странице и имеем необязательный аргумент;
- мы находимся внутри страницы с примечанием без такового;
- мы снаружи с одним;
- мы на улице без него.
expl3
делает расширение (относительно) простым. Это, по крайней мере, намного менее громоздко, чем жонглирование цепочками \expandafter
s, которые грозят регрессировать до бесконечности. Мы определяем 2 функции для случаев (1) и (2):
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnnn
{
\index [#1] { #3 | pn {#2}{#4} }
}
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnn
{
\index { #2 | pn {#1}{#3} }
}
Если вы используете этот код, обратите внимание, что этонетправильный способ сделать это. Как объясняется ниже, мы здесь обходим стандартные механизмы.
Затем мы сообщаем LaTeX, что нам нужны варианты, которые должны получить предварительно развернутый аргумент на втором или первом месте:
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnnn { nene }
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnn { ene }
Это означает, что LaTeX расширит эти аргументы перед передачей их в наши базовые функции, так что нам не нужно этого делать. Так что теперь мы можем определить версию для \is
обработки наших 4 случаев:
\NewDocumentCommand {\is} { om }{%
\if@nopnote
\IfValueTF { #1 } {
\index[#1]{#2}
}{
\index{#2}
}
\else
\hypertarget{pn:\tempnumber}{}%
\IfValueTF { #1 } {
\thomkrates_pagenoteindex:nene { #1 } { \tempnumber } { #2 } { \temppgnumber }
}{
\thomkrates_pagenoteindex:ene { \tempnumber } { #2 } { \temppgnumber }
}
\fi
}
Поскольку я не понимаю формат xindy
wants (в отличие от makeindex
) и не смог найти соответствующую документацию (которая, как я предполагаю, где-то существует), я отказался от попыток выяснить, как заставить номер страницы отображаться при \hyperindexformat
использовании в , .idx
а не в \hyperpage
.
Поэтому на этом этапе мы используем подход «грубой силы и невежества», просто добавляя номер страницы напрямую и обходя обычные механизмы:
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
\edef\temppgnumber{\thepage}%
{\normalfont #1.} }
Мы также изменяем наше определение \pn
, чтобы использовать цель, которую мы добавили \is
:
\newcommand\pn[2]{\hyperpage{#2}\hyperlink{pn:#1}{n#1}}
Полный код:
\documentclass{report}
% ateb: https://tex.stackexchange.com/a/705581/ addaswyd o gwestiwn Thomkrates: https://tex.stackexchange.com/q/705565/
\usepackage{index}
\usepackage[texindy,splitindex]{imakeidx}
\usepackage[hidelinks]{hyperref}
\usepackage[page]{pagenote}
\newcommand\pn[2]{\hyperpage{#2}\hyperlink{pn:#1}{n#1}}
\makeatletter
\let\if@nopnote\iffalse % just for the example
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
\edef\temppgnumber{\thepage}%
{\normalfont #1.} }
\ExplSyntaxOn
\NewDocumentCommand {\is} { om }{%
\if@nopnote
\IfValueTF { #1 } {
\index[#1]{#2}
}{
\index{#2}
}
\else
\hypertarget{pn:\tempnumber}{}%
\IfValueTF { #1 } {
\thomkrates_pagenoteindex:nene { #1 } { \tempnumber } { #2 } { \temppgnumber }
}{
\thomkrates_pagenoteindex:ene { \tempnumber } { #2 } { \temppgnumber }
}
\fi
}
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnnn
{
\index [#1] { #3 | pn {#2}{#4} }
}
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnnn { nene }
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnn
{
\index { #2 | pn {#1}{#3} }
}
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnn { ene }
\ExplSyntaxOff
\makeatother
\makeindex[program=texindy,name=Names,title=Names]
\makeindex[program=texindy,name=Something,title=Something]
\makepagenote
\begin{document}
First index.\index[Something]{First index}
Sentence.\pagenote{First pagenote without index.}
\clearpage
Emph index.\index[Something]{Emph index@\emph{Emph index}}
pagenote and index.\pagenote{Second pagenote with index.\is[Something]{Index inside second pagenote}}
\clearpage
Third pagenote.\pagenote{\emph{Emph index word}.\is[Something]{Emph index@\emph{Emph index}}}
Namenindex\index[Names]{Namenindex}
\printnotes
\printindex[Something]
\printindex[Names]
\end{document}