カウンターの出力を全角数字にする方法

カウンターの出力を全角数字にする方法

- horagai K の投稿
返信数: 15
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- Dosanko 道産子 の投稿
こんにちは,道産子です.

> いろいろ検索してみましたが見当たりません。
tex カウンタ 全角
で検索してみて下さい.
Dosanko 道産子 への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<Dosanko様

>tex カウンタ全角で検索してみて下さい.

ありがとうございます。
書いておくのを忘れましたが、それでググって出てくる記事はチェック済です。
そこでの方法は、ifcaseを使って、
  \ifcase#1 0\or 1\or …… 10\or 11\or…… 20\or 21\or…
とすべての変換パターンを直接定義した変換テーブルを使うだけなので、
当然書かれていない数字は使えません。カウンターにはどんな大きな数字が
出てくるか不明な状況なので、私の目的にはそぐわないのです。
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- 本田 知亮 の投稿
\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}
本田 知亮 への返信

Re: カウンターの出力を全角数字にする方法

- 本田 知亮 の投稿
\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式の
ディスパッチテーブルを作っています.
本田 知亮 への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<本田様

ありがとうございます!
おかげさまで、二日間悩んでいたのがすっきりしました(^^;

>ポイントは\@tforに\expandafterを付けまくること.

\@tforに\expandafterをつけるというのは盲点でした。(^^ゞ
しかし、それを思いついたとしても、私ならこんなに\expandafterを
付けつけまくるという方法には思い至らなかったと思います。

>ちょっとだけシンプルに.

これもきれいなコードですね。

>TeX式のディスパッチテーブルを作っています.

このやり方は初めて知りました。
\ifcase を使う方法よりもきれいだし、応用も効きそうですね。
たいへん参考になりました。

>\DeclareRobustCommandにしてるのは
>この手の再帰処理(\@tforは再帰処理です)は
>不用意に展開されるとエラーになるのでそれへの配慮です.

\DeclareRobustCommand というコマンドも初めて知りました。
私がマクロ作成の参考にしている本
(クヌース博士の「TeXbook」(翻訳版)、磯崎先生の「LATEX自由自在」)
にはこのコマンドが見当たらないのですが、このコマンドは
何をするものなのでしょうか。
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- 匿 名 の投稿
\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 で保護された形で
%%% 定義されるという点には変わりありません.
匿 名 への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<匿名様

ありがとうございました。
\protectによる保護付きの\newcommandということですね。
LaTeX2eのコマンドなら、たしかにクヌース本や磯崎本に
載っているはずがないはずですね(^^ゞ
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- Z. R. の投稿

裏技的な方法として、pTeX の \kansuji (漢数字に変換する命令)を乗っ取るという方法があります。

\@tfor\x:=0123456789\do{\kansujichar\x=\jis"233\x\relax}

これで、\kansuji〈数〉 や plext パッケージの \Kanji{〈LaTeX カウンタ名〉} の出力は漢数字から全角数字に変わります。

Z. R. への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<Z. R.様

>pTeX の \kansuji (漢数字に変換する命令)を乗っ取る
>という方法があります。   

ありがとうございます。
これもシンプルでいいですね。pTeX限定ならこれでもよさそうです。
pTeX特有のコマンドはほとんど使ったことがないので、\kansuji
コマンドのことも知りませんでした。
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- 匿 名 の投稿
次の例を検討するのもよいでしょう.
これは単に,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}
匿 名 への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<匿名様

\Roman はどうやっているのかと思っていたのですが、まさか
再帰呼び出しで定義されているとは思いませんでした。
\@tfor を使うより直感的にはわかりにくいけど、コードは非常に
すっきりしますね。
最後にアットマークをつけて再帰呼び出し終了のフラグに使うなど、
なかなかトリッキーなやり方だと思いました。
(texマクロになれた人にとっては常識的な方法かも知れませんが)

この方法もいろいろ応用が効きそうです。
有用な情報をありがとうございました。
horagai K への返信

Re: カウンターの出力を全角数字にする方法

- 匿 名 の投稿
\@tfor を避けることにはもっと大きな理由があります。
それは、\@tfor は突き詰めてゆけば展開可能ではないからです。

horagai K への返信

Re: カウンターの出力を全角数字にする方法

- 匿 名 の投稿
いろいろな方法が紹介されていますが、
> うまくいかないのはこれが原因だ!
に対する直接的な答えはなかったようなので、蛇足ながら。

もとの発言のソースの
\def\zenkakubangou{\expandafter\zenkakusuujihenkan{\thebangou}}
の部分を
\def\zenkakubangou{\expandafter\zenkakusuujihenkan\expandafter{\the\c@bangou}}
に変えればいいでしょう。

思い違いは二点あります。一つ目は、
\expandafter\macro{\arg}
とした場合に、\expandafter によって先に展開されるのは
\arg ではなくて { だということ。
もうひとつは、\thebangou を一段階展開しても
数値を表す文字列にはならないということです。
\thebangou というのは bangou カウンタの値を、
既定の形式で組版するためのコマンドなのでしたよね。

匿 名 への返信

Re: カウンターの出力を全角数字にする方法

- horagai K の投稿
<匿名様
>\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マクロの解説書にも書かれていないので、
(いや、「ちゃんと読んで理解していれば当然わかることだろう」
と叱られそうですが、少なくとも、このような思い違いはするはずもない
、というほど明示的にわかりやすくは書かれていないと思います。)
このように的確に指摘して頂けると今後のためにもなります。
いろいろとありがとうございました。