\documentclass{jarticle}
\makeatletter
\def\@zenkakusuuji#1{%
\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\else\relax\fi%
}%
\def\zenkakusuujihenkan#1{%
\edef\temp{#1}%
\let\@zenkaku=\empty%
\expandafter\@tfor\expandafter\@singlenumber\expandafter:\expandafter=\temp\do{%
\let\@tmpzenkaku=\@zenkaku%
\edef\@zenkaku{\@tmpzenkaku\@zenkakusuuji\@singlenumber}%
}%
\@zenkaku%
}%
\newcounter{bangou}%
\setcounter{bangou}{1}%
\def\zenkakubangou{\zenkakusuujihenkan{\thebangou}}%
\newcommand{\Bangou}{\zenkakubangou\advance\c@bangou\@ne}%
\makeatother
\begin{document}
\Bangou \Bangou \Bangou \Bangou \Bangou
\Bangou \Bangou \Bangou \Bangou \Bangou
\Bangou \Bangou \Bangou \Bangou \Bangou
\end{document}
\makeatletter
\def\@zenkakusuuji#1{%
\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\else\relax\fi%
}%
\def\zenkakusuujihenkan#1{%
\edef\temp{#1}%
\let\@zenkaku=\empty%
\expandafter\@tfor\expandafter\@singlenumber\expandafter:\expandafter=\temp\do{%
\let\@tmpzenkaku=\@zenkaku%
\edef\@zenkaku{\@tmpzenkaku\@zenkakusuuji\@singlenumber}%
}%
\@zenkaku%
}%
\newcounter{bangou}%
\setcounter{bangou}{1}%
\def\zenkakubangou{\zenkakusuujihenkan{\thebangou}}%
\newcommand{\Bangou}{\zenkakubangou\advance\c@bangou\@ne}%
\makeatother
\begin{document}
\Bangou \Bangou \Bangou \Bangou \Bangou
\Bangou \Bangou \Bangou \Bangou \Bangou
\Bangou \Bangou \Bangou \Bangou \Bangou
\end{document}
\documentclass{jarticle}
\makeatletter
\count@\z@
\@tfor\temp:=0123456789\do{%
\expandafter\edef\csname zen@\the\count@\endcsname{\temp}%
\advance\count@\@ne
}
\DeclareRobustCommand{\NumToZenkaku}[1]{%
\edef\@arg{#1}%
\let\@temp\@empty
\expandafter\@tfor\expandafter\Num\expandafter:\expandafter=\@arg\do{%
\edef\@temp{\@temp\@nameuse{zen@\Num}}%
}%
\@temp
}
\makeatother
\begin{document}
\NumToZenkaku{100}
\end{document}
ちょっとだけシンプルに.
ポイントは\@tforに\expandafterを付けまくること.
#1をわざわざ置き換えてるのは単なる趣味です.
\DeclareRobustCommandにしてるのは
この手の再帰処理(\@tforは再帰処理です)は
不用意に展開されるとエラーになるので
それへの配慮です.
これまた個人的趣味で\ifcaseやいわゆるswitchの類の多重分岐は好きではないので,TeX式の
ディスパッチテーブルを作っています.
\makeatletter
\count@\z@
\@tfor\temp:=0123456789\do{%
\expandafter\edef\csname zen@\the\count@\endcsname{\temp}%
\advance\count@\@ne
}
\DeclareRobustCommand{\NumToZenkaku}[1]{%
\edef\@arg{#1}%
\let\@temp\@empty
\expandafter\@tfor\expandafter\Num\expandafter:\expandafter=\@arg\do{%
\edef\@temp{\@temp\@nameuse{zen@\Num}}%
}%
\@temp
}
\makeatother
\begin{document}
\NumToZenkaku{100}
\end{document}
ちょっとだけシンプルに.
ポイントは\@tforに\expandafterを付けまくること.
#1をわざわざ置き換えてるのは単なる趣味です.
\DeclareRobustCommandにしてるのは
この手の再帰処理(\@tforは再帰処理です)は
不用意に展開されるとエラーになるので
それへの配慮です.
これまた個人的趣味で\ifcaseやいわゆるswitchの類の多重分岐は好きではないので,TeX式の
ディスパッチテーブルを作っています.
<本田様
ありがとうございます!
おかげさまで、二日間悩んでいたのがすっきりしました(^^;
>ポイントは\@tforに\expandafterを付けまくること.
\@tforに\expandafterをつけるというのは盲点でした。(^^ゞ
しかし、それを思いついたとしても、私ならこんなに\expandafterを
付けつけまくるという方法には思い至らなかったと思います。
>ちょっとだけシンプルに.
これもきれいなコードですね。
>TeX式のディスパッチテーブルを作っています.
このやり方は初めて知りました。
\ifcase を使う方法よりもきれいだし、応用も効きそうですね。
たいへん参考になりました。
>\DeclareRobustCommandにしてるのは
>この手の再帰処理(\@tforは再帰処理です)は
>不用意に展開されるとエラーになるのでそれへの配慮です.
\DeclareRobustCommand というコマンドも初めて知りました。
私がマクロ作成の参考にしている本
(クヌース博士の「TeXbook」(翻訳版)、磯崎先生の「LATEX自由自在」)
にはこのコマンドが見当たらないのですが、このコマンドは
何をするものなのでしょうか。
ありがとうございます!
おかげさまで、二日間悩んでいたのがすっきりしました(^^;
>ポイントは\@tforに\expandafterを付けまくること.
\@tforに\expandafterをつけるというのは盲点でした。(^^ゞ
しかし、それを思いついたとしても、私ならこんなに\expandafterを
付けつけまくるという方法には思い至らなかったと思います。
>ちょっとだけシンプルに.
これもきれいなコードですね。
>TeX式のディスパッチテーブルを作っています.
このやり方は初めて知りました。
\ifcase を使う方法よりもきれいだし、応用も効きそうですね。
たいへん参考になりました。
>\DeclareRobustCommandにしてるのは
>この手の再帰処理(\@tforは再帰処理です)は
>不用意に展開されるとエラーになるのでそれへの配慮です.
\DeclareRobustCommand というコマンドも初めて知りました。
私がマクロ作成の参考にしている本
(クヌース博士の「TeXbook」(翻訳版)、磯崎先生の「LATEX自由自在」)
にはこのコマンドが見当たらないのですが、このコマンドは
何をするものなのでしょうか。
\DeclareRobustCommand は,コマンド名の通りのこと
(declare robust command)を行います.
・\DeclareRobustCommand の書式は \newcommand と同じです.
・\DeclareRobustCommand で定義されるコマンドは最初から robust な
(\protect による保護付きの)コマンドです.
%%% これは,LaTeX2e のコマンド(LaTeX 2.09 にはないコマンド)なので
%%% 当然,「LaTeX 2.09 時代に書かれた参考書」や「そもそも plain TeX
%%% のことしか書かれていない書籍」には載っていません.
例えば,
\DeclareRobustCommand\foo[2]{...}
という記述に対しては,
\def\foo{\protect\foo<space>}
%%% ここでは便宜上 \foo<space> と書きましたが,これは(この場では)
%%% \csname foo \endcsname (\endcsname の直前には空白文字があります)
%%% で与えられるコントロール・ワードを指すものとします.
\newcommand\foo<space>[2]{...}
のような一連の定義がなされます.
%%% \DeclareRobustCommand でコントロール・シンボルを定義した
%%% 場合には内部処理は少し変わりますが,\protect で保護された形で
%%% 定義されるという点には変わりありません.
(declare robust command)を行います.
・\DeclareRobustCommand の書式は \newcommand と同じです.
・\DeclareRobustCommand で定義されるコマンドは最初から robust な
(\protect による保護付きの)コマンドです.
%%% これは,LaTeX2e のコマンド(LaTeX 2.09 にはないコマンド)なので
%%% 当然,「LaTeX 2.09 時代に書かれた参考書」や「そもそも plain TeX
%%% のことしか書かれていない書籍」には載っていません.
例えば,
\DeclareRobustCommand\foo[2]{...}
という記述に対しては,
\def\foo{\protect\foo<space>}
%%% ここでは便宜上 \foo<space> と書きましたが,これは(この場では)
%%% \csname foo \endcsname (\endcsname の直前には空白文字があります)
%%% で与えられるコントロール・ワードを指すものとします.
\newcommand\foo<space>[2]{...}
のような一連の定義がなされます.
%%% \DeclareRobustCommand でコントロール・シンボルを定義した
%%% 場合には内部処理は少し変わりますが,\protect で保護された形で
%%% 定義されるという点には変わりありません.
次の例を検討するのもよいでしょう.
これは単に,LaTeX がすでに用意している \Roman の内部処理を
真似しただけです.
\documentclass{jarticle}
\begin{document}
\makeatletter
\def\fullwidtharabic#1{\expandafter\@fullwidtharabic\csname c@#1\endcsname}
\def\@fullwidtharabic#1{\expandafter\@@fullwidtharabic\number#1@}
\def\@@fullwidtharabic#1{%
\if#1@\else
\ifcase#10\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\fi
\expandafter\@@fullwidtharabic
\fi}
\makeatother
\def\thesection{\fullwidtharabic{section}}
\def\thesubsection{\thesection .\fullwidtharabic{subsection}}
\section{サンプル}
\subsection{サンプル}
サンプルです(\ref{sec:last-sample}節参照)\<.
\subsection{サンプル}
サンプルです.
\section{サンプル}
サンプルです.
\setcounter{section}{11}
\section{サンプル}\label{sec:last-sample}
サンプルです.
\end{document}
これは単に,LaTeX がすでに用意している \Roman の内部処理を
真似しただけです.
\documentclass{jarticle}
\begin{document}
\makeatletter
\def\fullwidtharabic#1{\expandafter\@fullwidtharabic\csname c@#1\endcsname}
\def\@fullwidtharabic#1{\expandafter\@@fullwidtharabic\number#1@}
\def\@@fullwidtharabic#1{%
\if#1@\else
\ifcase#10\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\fi
\expandafter\@@fullwidtharabic
\fi}
\makeatother
\def\thesection{\fullwidtharabic{section}}
\def\thesubsection{\thesection .\fullwidtharabic{subsection}}
\section{サンプル}
\subsection{サンプル}
サンプルです(\ref{sec:last-sample}節参照)\<.
\subsection{サンプル}
サンプルです.
\section{サンプル}
サンプルです.
\setcounter{section}{11}
\section{サンプル}\label{sec:last-sample}
サンプルです.
\end{document}
いろいろな方法が紹介されていますが、
> うまくいかないのはこれが原因だ!
に対する直接的な答えはなかったようなので、蛇足ながら。
もとの発言のソースの
\def\zenkakubangou{\expandafter\zenkakusuujihenkan{\thebangou}}
の部分を
\def\zenkakubangou{\expandafter\zenkakusuujihenkan\expandafter{\the\c@bangou}}
に変えればいいでしょう。
思い違いは二点あります。一つ目は、
\expandafter\macro{\arg}
とした場合に、\expandafter によって先に展開されるのは
\arg ではなくて { だということ。
もうひとつは、\thebangou を一段階展開しても
数値を表す文字列にはならないということです。
\thebangou というのは bangou カウンタの値を、
既定の形式で組版するためのコマンドなのでしたよね。
> うまくいかないのはこれが原因だ!
に対する直接的な答えはなかったようなので、蛇足ながら。
もとの発言のソースの
\def\zenkakubangou{\expandafter\zenkakusuujihenkan{\thebangou}}
の部分を
\def\zenkakubangou{\expandafter\zenkakusuujihenkan\expandafter{\the\c@bangou}}
に変えればいいでしょう。
思い違いは二点あります。一つ目は、
\expandafter\macro{\arg}
とした場合に、\expandafter によって先に展開されるのは
\arg ではなくて { だということ。
もうひとつは、\thebangou を一段階展開しても
数値を表す文字列にはならないということです。
\thebangou というのは bangou カウンタの値を、
既定の形式で組版するためのコマンドなのでしたよね。
<匿名様
>\thebangou というのは bangou カウンタの値を、
>既定の形式で組版するためのコマンドなのでしたよね。
\thebangou は、単に \the\c@bangou を簡略表現にした
コマンドだとばかり思い込んでました。(^^ゞ
>\expandafter\macro{\arg}
>とした場合に、\expandafter によって先に展開されるのは
>\arg ではなくて { だということ。
これは…(絶句)
まさしくまさしくまさしく盲点でした。(^^ゞ
{は通常はコマンド文字列や引数のグルーピングを示す記号
だけに、expandafterも{は無視するはずだと思っていました。
実は、
\def\zenkakubangou{\expandafter\zenkakusuujihenkan{\the\c@bangou}}
なども試してみたのですが、やはりうまく行かずお手上げ
になっていたわけです。
まさしく二つの盲点にちょうどはまってしまったコードを
書いていたわけですね(^^ゞ
今やってみたら
\def\zenkakubangou{\expandafter\zenkakusuujihenkan\the\c@bangou}
でもうまく行きました。(^^ゞ
このような知識は、TeXマクロの解説書にも書かれていないので、
(いや、「ちゃんと読んで理解していれば当然わかることだろう」
と叱られそうですが、少なくとも、このような思い違いはするはずもない
、というほど明示的にわかりやすくは書かれていないと思います。)
このように的確に指摘して頂けると今後のためにもなります。
いろいろとありがとうございました。
>\thebangou というのは bangou カウンタの値を、
>既定の形式で組版するためのコマンドなのでしたよね。
\thebangou は、単に \the\c@bangou を簡略表現にした
コマンドだとばかり思い込んでました。(^^ゞ
>\expandafter\macro{\arg}
>とした場合に、\expandafter によって先に展開されるのは
>\arg ではなくて { だということ。
これは…(絶句)
まさしくまさしくまさしく盲点でした。(^^ゞ
{は通常はコマンド文字列や引数のグルーピングを示す記号
だけに、expandafterも{は無視するはずだと思っていました。
実は、
\def\zenkakubangou{\expandafter\zenkakusuujihenkan{\the\c@bangou}}
なども試してみたのですが、やはりうまく行かずお手上げ
になっていたわけです。
まさしく二つの盲点にちょうどはまってしまったコードを
書いていたわけですね(^^ゞ
今やってみたら
\def\zenkakubangou{\expandafter\zenkakusuujihenkan\the\c@bangou}
でもうまく行きました。(^^ゞ
このような知識は、TeXマクロの解説書にも書かれていないので、
(いや、「ちゃんと読んで理解していれば当然わかることだろう」
と叱られそうですが、少なくとも、このような思い違いはするはずもない
、というほど明示的にわかりやすくは書かれていないと思います。)
このように的確に指摘して頂けると今後のためにもなります。
いろいろとありがとうございました。