
Dies ist ein Spin-off einer anderen Frage, die ich hier gepostet habe.
\documentclass[8pt]{book}
\usepackage{etoolbox}
\usepackage{hyperref}
\newcommand{\mychapter}[1]{\chapter{#1} \hypertarget{chapter::\theHchapter}{}}
\newcommand{\refChapter}{\hyperlink{chapter::\theHchapter}{\thechapter}}
\newcommand{\addTimeline}[2]{%
\ifcsname timeLine#1\endcsname
\csappto{timeLine#1}{\unexpanded{\\& #2 & } \thechapter}%
\else
\csdef{timeLine#1}{\unexpanded{\\\textbf{#1} & #2 & } \thechapter}%
\fi
}
\newcount\timelineCounter
\newcommand{\printTimeline}[2]{%
\def\timelineData{}%
\timelineCounter=#1\relax
\loop \ifnum \timelineCounter<#2
\edef\timelineData{\expandonce{\timelineData}\csuse{timeLine\the\timelineCounter}}%
\advance \timelineCounter 1
\repeat
\begin{tabular}{c p{7cm} c}
\timelineData
\end{tabular}
}
\begin{document}
\mychapter{First}
\addTimeline{4}{Event1}
\addTimeline{19}{Event2}
\addTimeline{2}{Event3}
\mychapter{Second}
\addTimeline{29}{Event4}
\addTimeline{15}{Event5}
\addTimeline{19}{Event6}
\mychapter{Timeline}
\printTimeline{1}{30}
\end{document}
Ich erwartete, dass es zwei leere Kapitel druckt, gefolgt von einem Kapitel 3, genannt Timeline mit
2 Event3 1
4 Event1 1
15 Event5 2
19 Event2 1
Event6 2
29 Event4 2
aber stattdessen bekomme ich in der dritten Spalte nur „3“. Im Idealfall würde ich \refChapter
anstelle von den Befehl verwenden, den ich erstellt habe \thechapter
, aber ersterer wird nicht kompiliert. Ich habe keine Ahnung, wie ich diese Art von Ausdruck erweitern soll. Für jede Anleitung wäre ich dankbar.
Antwort1
Sie müssen \cseappto
und verwenden \csedef
, aber dazu ist ein weiteres \unexpanded
um den Teil herum erforderlich, den Sie nicht erweitern möchten:
\documentclass{book}
\usepackage{etoolbox}
\usepackage{hyperref}
\newcommand{\mychapter}[1]{\chapter{#1} \hypertarget{chapter::\theHchapter}{}}
\newcommand{\refChapter}{\hyperlink{chapter::\theHchapter}{\thechapter}}
\newcommand{\addTimeline}[2]{%
\ifcsname timeLine#1\endcsname
\cseappto{timeLine#1}{\unexpanded{\unexpanded{\\& #2 & }} \thechapter}%
\else
\csedef{timeLine#1}{\unexpanded{\unexpanded{\\\textbf{#1} & #2 & }} \thechapter}%
\fi
}
\newcount\timelineCounter
\newcommand{\printTimeline}[2]{%
\def\timelineData{}%
\timelineCounter=#1\relax
\loop \ifnum \timelineCounter<#2
\edef\timelineData{\expandonce{\timelineData}\csuse{timeLine\the\timelineCounter}}%
\advance \timelineCounter 1
\repeat
\begin{tabular}{c p{7cm} c}
\timelineData
\end{tabular}
}
\begin{document}
\mychapter{First}
\addTimeline{4}{Event1}
\addTimeline{19}{Event2}
\addTimeline{2}{Event3}
\mychapter{Second}
\addTimeline{29}{Event4}
\addTimeline{15}{Event5}
\addTimeline{19}{Event6}
\mychapter{Timeline}
\printTimeline{1}{30}
\end{document}
Dasselbe mit expl3
, aber mit weniger Problemen mit der Erweiterung, weil wir \theHchapter
und erweitern können, \thechapter
wenn das Hauptmakro aufgerufen wird.
\documentclass{book}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\cs_set_eq:NN \latexchapter \chapter
% modify \chapter to add a hypertarget
\RenewDocumentCommand{\chapter}{sO{#3}m}
{
\IfBooleanTF{#1}
{
\latexchapter*{#3}
}
{
\latexchapter[#2]{\hypertarget{chapter::\theHchapter}{#3}}
}
}
\NewDocumentCommand{\addTimeline}{smm}
{ % here \theHchapter and \thechapter are expanded prior to doing the hard work
\benedict_timeline_add:xxnn { \IfBooleanF{#1}{\theHchapter} } { \thechapter } { #2 } { #3 }
}
\cs_new_protected:Nn \benedict_timeline_add:nnnn
{
\tl_if_exist:cTF { l_benedict_timeline_#3_tl }
{ % the header has already appeared
\tl_put_right:cn { l_benedict_timeline_#3_tl } { & #4 }
}
{ % the header is new
\tl_new:c { l_benedict_timeline_#3_tl }
\tl_put_right:cn { l_benedict_timeline_#3_tl } { \textbf{#3} & #4 }
}
% now add the reference; #3 is the header
% #1 and #2 are \theHchapter and \thechapter (expanded)
\benedict_timeline_add_ref:nnn { #3 } { #1 } { #2 }
}
\cs_generate_variant:Nn \benedict_timeline_add:nnnn { xx }
\cs_new_protected:Nn \benedict_timeline_add_ref:nnn
{
\tl_if_empty:nTF { #2 } % \theHchapter
{% modify here for the formatting
\tl_put_right:cn { l_benedict_timeline_#1_tl } { & \S #3 \\ }
}
{
\tl_put_right:cn { l_benedict_timeline_#1_tl } { & \S \hyperlink{chapter::#2}{#3} \\ }
}
}
\NewDocumentCommand{\printTimeline}{mm}
{
\tl_clear:N \l__benedict_timeline_body_tl
\int_step_inline:nnnn { #1 } { 1 } { #2 }
{
\tl_if_exist:cT { l_benedict_timeline_##1_tl }
{
\tl_put_right:Nv \l__benedict_timeline_body_tl { l_benedict_timeline_##1_tl }
}
}
\begin{tabular}{c p{7cm} c}
\tl_use:N \l__benedict_timeline_body_tl
\end{tabular}
}
\tl_new:N \l__benedict_timeline_body_tl
\cs_generate_variant:Nn \tl_put_right:Nn { Nv }
\ExplSyntaxOff
\begin{document}
\chapter{First}
\addTimeline{4}{Event1}
\addTimeline{19}{Event2}
\addTimeline{2}{Event3}
\chapter{Second}
\addTimeline{29}{Event4}
\addTimeline{15}{Event5}
\addTimeline{19}{Event6}
\chapter{Timeline}
\printTimeline{1}{30}
\end{document}