\expandafter 在這裡如何運作?code
需要完成以下內容。我想你們中的一些人可能會輕鬆地做到這一點,希望如此。
目的是:將字母n
(或任何其他字母,for Notes
of傳播pagenote
到 中index
)與pagenotenumber
for\index[]{}
內\pagenote{}
。
是code
源自於
\index inside footnote:如何使用索引包正確傳播腳註編號?
\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
。 :
- 我們在頁面註釋中並且有一個可選參數;
- 我們在一頁註釋中,沒有註釋;
- 我們和一個人在外面;
- 我們在外面沒有人。
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}