
これは私がここに投稿した別の質問の派生です。
\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}
私は、2つの空の章と、それに続く第3章「タイムライン」を印刷することを期待していました。
2 Event3 1
4 Event1 1
15 Event5 2
19 Event2 1
Event6 2
29 Event4 2
しかし、3 列目にはすべて "3" が表示されます。理想的なシナリオでは、\refChapter
の代わりに作成したコマンドを使用します\thechapter
が、前者はコンパイルされません。この種の式をどのように展開するかについては、少しわかりません。ご指導いただければ幸いです。
答え1
\cseappto
と を使用する必要があります\csedef
が、\unexpanded
展開したくない部分の周囲に別の が必要になります。
\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}
も同様ですが、メイン マクロが呼び出されるときにと をexpl3
展開できるため、展開に関する問題が少なくなります。\theHchapter
\thechapter
\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}