\index в \pagenote с опцией splitindex (для множественного индекса)

\index в \pagenote с опцией splitindex (для множественного индекса)

Как здесь работает \expandafter? codeНеобходимо выполнить следующее. Я предполагаю, что некоторые из вас смогут сделать это с легкостью, надеюсь.

Цель состоит в том, чтобы распространить букву n(или любую другую, for Notesof pagenoteв index) с pagenotenumberfor \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:

  1. мы находимся внутри примечания к странице и имеем необязательный аргумент;
  2. мы находимся внутри страницы с примечанием без такового;
  3. мы снаружи с одним;
  4. мы на улице без него.

expl3делает расширение (относительно) простым. Это, по крайней мере, намного менее громоздко, чем жонглирование цепочками \expandafters, которые грозят регрессировать до бесконечности. Мы определяем 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
}

Поскольку я не понимаю формат xindywants (в отличие от 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}

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