\pagenote 中的 \index 带有 splitindex 选项(用于多个索引)

\pagenote 中的 \index 带有 splitindex 选项(用于多个索引)

\expandafter 在这里是如何工作的?需要完成以下内容code。我希望你们中的一些人可以轻松做到这一点。

目的是:将字母n(或任何其他的,用于Notespagenote进入index)与pagenotenumber用于\index[]{}在内传播\pagenote{}

源自code\index inside 脚注:如何使用索引包正确传播脚注编号?

\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使扩展(相对)简单。至少,它比处理\expandafter可能回归无穷大的 s 链要简单得多。我们针对情况 (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 会在将这些参数传递给我们的基础函数之前对其进行扩展,因此我们不必这样做。所以现在我们可以定义一个版本来\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要求(而不是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}

相关内容