분할 인덱스 옵션이 있는 \pagenote의 \index(다중 인덱스의 경우)

분할 인덱스 옵션이 있는 \pagenote의 \index(다중 인덱스의 경우)

여기서 \expandafter는 어떻게 작동하나요? 다음을 code완료해야 합니다. 여러분 중 일부는 이 작업을 쉽게 수행할 수 있을 것으로 예상됩니다.

의도는 for inside 를 사용하여 문자 n(또는 기타 for Notesof ) pagenote를 전파하는 것입니다 .indexpagenotenumber\index[]{}\pagenote{}

code다음에서 파생됩니다. 각주 내부 \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. 그것이 목표 행동인지 확실하지 않습니다.

코드의 초기 문제는 \pagenoteindex3개의 인수를 요구하도록 정의했지만 2개만 전달한다는 것입니다. 여기서 선택적 인수를 원하는 것 같습니다. 하나를 에 전달하므로 \is2개가 아닌 4개의 경우가 필요합니다. :

  1. 우리는 페이지 노트 안에 있고 선택적 인수가 있습니다.
  2. 우리는 하나도 없는 페이지 노트 안에 있습니다.
  3. 우리는 하나와 함께 밖에 있습니다.
  4. 우리는 밖에 있는데 아무도 없어요.

expl3확장을 (상대적으로) 간단하게 만듭니다. 적어도 \expandafter무한대로 회귀하겠다고 위협하는 저글링 체인보다 훨씬 덜 다루기 쉽습니다. 사례 (1)과 (2)에 대해 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가 해당 인수를 기본 함수에 전달하기 전에 확장하므로 우리가 그럴 필요가 없음을 의미합니다. 이제 \is4가지 경우를 처리하기 위한 버전을 정의할 수 있습니다.

\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원하는 것을 이해하지 못하고 ( 어딘가에 있다고 가정하는) 관련 문서를 찾을 수 없었기 때문에 가 사용될 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}

관련 정보