ここで \expandafter はどのように動作するのでしょうか? 次の作業をcode
完了する必要があります。うまくいけば、皆さんの中にはこれを簡単に実行できる人もいると思います。
意図は、内のを使って、の文字 (またはのn
その他の文字) を に伝播することです。Notes
pagenote
index
pagenotenumber
\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
。それが目標の動作であるかどうかはわかりません。
コードの最初の問題は、 を\pagenoteindex
3 つの引数を必要とするように定義しているのに、 に 2 つしか渡していないことです。 に 1 つ渡しているので、ここではオプションの引数が必要だと思います\is
。そのため、2 つではなく 4 つのケースが必要です。
- ページノート内にオプションの引数があります。
- 私たちはページノートの中にいますが、ノートはありません。
- 私たちは1人と一緒に外にいます。
- 私たちはそれなしで外にいます。
expl3
拡張は(比較的)簡単になります。少なくとも、無限に後退する恐れのある s の連鎖を扱うよりははるかに扱いやすいです\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 に、2 番目または 1 番目の場所で事前に展開された引数を受け取るバリアントが必要であることを伝えます。
\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}