ページ数と同数の\scsnowman をヘッダーに出力させたい

ページ数と同数の\scsnowman をヘッダーに出力させたい

- tanaka kanata の投稿
返信数: 2
以下のように.texファイルを作成しました。
環境は,TeX Live 2018,TeXWorks,タイプセットはpLaTeX(ptex2pdf)です。

\documentclass[dvipdfmx]{jsarticle}

\usepackage{fancyhdr}

\usepackage{scsnowman}


\newcounter{yuki}

\newcounter{bunsyo}


\pagestyle{fancy}


\chead{%

\setcounter{yuki}{0}

\loop

\ifnum\theyuki<\thepage

\hfill\scsnowman\stepcounter{yuki}

\repeat

\hfill

}


\begin{document}

\loop

\ifnum\thebunsyo<10 これは\thepage ページ目の文。\clearpage \stepcounter{bunsyo}\repeat

\end{document}


つまり,私の意図としては,ページ数と同数の\scsnowman をヘッダーに出力させたい,ということです。

しかし,これをコンパイルすると\scsnowman はどのページにも1体しかできません。

例えば,\scsnowman ではなく代わりに,otf.styを読み込んで\ajSnowman を用いると,私の意図通りにページ数と同数の\ajSnowman をヘッダーに出力することができます。

しかしながら\scsnowman を用いたいのですが,良い対策はありますでしょうか。ご教授いただければ幸いです。


(\scsnowman パッケージには無限ループを防止するうんぬんがあるらしいのですが,私にはよくわかりませんでしたので,質問させていただきました。)

tanaka kanata への返信

Re: ページ数と同数の\scsnowman をヘッダーに出力させたい

- しっぽ 愛好家 の投稿
次のサンプルを検討してください.
\documentclass{article}
\begin{document}

\newcounter{counterA}
\newcounter{counterB}

\def\macroA#1{%
   \setcounter{counterB}{0}%
   \loop\ifnum #1>\value{counterB}%
      \stepcounter{counterB}%
      [\thecounterB]
   \repeat}

\setcounter{counterA}{0}
\loop\ifnum 3>\value{counterA}%
   \stepcounter{counterA}%
   (\macroA{\value{counterA}})
\repeat
%%% ↑これはうまくいかない(今回の件は本質的にはこれと同じ(\scsnowman の
%%%   内部処理に \loop ... \repeat を使うマクロが含まれている)).
%%% \macroA の処理の中の \loop ... \repeat が,
%%% 外側の \loop ... \repeat の際に内部的に定義された \iterate を
%%% 変更してしまう.

\setcounter{counterA}{0}
\loop\ifnum 3>\value{counterA}%
   \begingroup%%% グルーピングで,内側の \loop ... \repeat が
              %%% 外側に影響しないようにすれば予定どおりに動く
   \stepcounter{counterA}%
   (\macroA{\value{counterA}})
   \endgroup
\repeat

%%% もっとも,最初から LaTeX の制御構造を使えば問題ない
\makeatletter
\def\macroA#1{%
   \setcounter{counterB}{0}%
   \@whilenum #1>\value{counterB}\do{%
      \stepcounter{counterB}%
      [\thecounterB] }}
\setcounter{counterA}{0}
\@whilenum 3>\value{counterA}\do{%
   \stepcounter{counterA}%
   (\macroA{\value{counterA}}) }
\makeatother
\end{document}
しっぽ 愛好家 への返信

Re: ページ数と同数の\scsnowman をヘッダーに出力させたい

- tanaka kanata の投稿
しっぽ愛好家様

\begingroup と\endgroup で目的の出力が得られました!大変ありがとうございます。マクロの仕組みについて不勉強な質問でした。