Wie funktioniert \expandafter hier? Folgendes code
muss ausgefüllt werden. Ich gehe davon aus, dass einige von euch das hoffentlich problemlos hinbekommen.
n
Die Absicht ist: den Buchstaben (oder ein beliebiges anderes Für Notes
von pagenote
in das index
) mit dem pagenotenumber
Für \index[]{}
innerhalb zu verbreiten \pagenote{}
.
Das code
ist abgeleitet von
\index innerhalb der Fußnote: Wie wird die Fußnotennummer mit dem Indexpaket korrekt weitergegeben?
\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}
Diese Funktion scheint eine Standardfunktion für die Indizierung im modernen Buchsatz zu sein, wird aber von LaTeX noch nicht erkannt. Es wäre großartig, wenn jemand dies unterstützen und eine Lösung präsentieren könnte.
Antwort1
Ich bin mir nicht ganz sicher, was Sie wollen. (Ich erinnere mich vage an frühere Fragen, aber diese hier enthält nicht viel, was mein Gedächtnis auffrischen könnte.)
Das Folgende generiert Notizen und Seitenzahlen in den Indizes, ohne den Inhalt der document
Umgebung zu ändern. Ob das das Zielverhalten ist, weiß ich nicht.
Das anfängliche Problem mit Ihrem Code besteht darin, dass Sie 3 erforderliche Argumente definiert haben \pagenoteindex
, aber nur 2 übergeben. Ich vermute, Sie möchten hier ein optionales Argument, da Sie eines an übergeben \is
, sodass wir 4 Fälle statt 2 benötigen:
- wir befinden uns in einer Seitennotiz und haben ein optionales Argument;
- wir befinden uns in einer Seitennotiz ohne eine solche;
- wir sind mit einem draußen;
- wir sind ohne draußen.
expl3
macht die Erweiterung (relativ) unkompliziert. Es ist zumindest viel weniger umständlich als das Jonglieren mit \expandafter
s-Ketten, die ins Unendliche zu regredieren drohen. Wir definieren zwei Funktionen für die Fälle (1) und (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} }
}
Wenn Sie diesen Code verwenden, beachten Sie bitte, dass diesnichtder richtige Weg, dies zu tun. Wie unten erläutert, umgehen wir hier die Standardmechanismen.
Dann teilen wir LaTeX mit, dass wir Varianten möchten, die an zweiter oder erster Stelle ein vordefiniertes Argument erhalten sollen:
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnnn { nene }
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnn { ene }
Das bedeutet, dass LaTeX diese Argumente erweitert, bevor sie an unsere Basisfunktionen übergeben werden, sodass wir das nicht tun müssen. Jetzt können wir also eine Version von definieren, \is
um unsere 4 Fälle zu behandeln:
\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
Da ich das Format will (im Gegensatz zu ) nicht verstehe makeindex
und die entsprechende Dokumentation nicht finden konnte (die vermutlich irgendwo existiert), habe ich es aufgegeben, herauszufinden, wie ich die Seitenzahl anzeigen lassen kann, wenn \hyperindexformat
im .idx
statt verwendet wird \hyperpage
.
Daher verwenden wir an dieser Stelle einen Ansatz, der auf roher Gewalt und Ignoranz beruht, indem wir die Seitenzahl einfach direkt hinzufügen und die üblichen Mechanismen umgehen:
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
\edef\temppgnumber{\thepage}%
{\normalfont #1.} }
Wir ändern unsere Definition auch \pn
, um das hinzugefügte Ziel zu nutzen \is
:
\newcommand\pn[2]{\hyperpage{#2}\hyperlink{pn:#1}{n#1}}
Vollständiger Code:
\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}