\expandafter 在这里是如何工作的?需要完成以下内容code
。我希望你们中的一些人可以轻松做到这一点。
目的是:将字母n
(或任何其他的,用于Notes
的pagenote
进入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 种:
- 我们在页面注释内并有一个可选参数;
- 我们在一个没有注释的页面内;
- 我们在外面有一个;
- 我们在外面没有它。
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}