すぐに章を展開する

すぐに章を展開する

これは私がここに投稿した別の質問の派生です。

\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}

関連情報