\defにおけるオプション引数について

\defにおけるオプション引数について

- 斎藤 漁火 の投稿
返信数: 3

pxruburicaパッケージとLuaLaTeXにおいて任意の1文字をコマンドのように扱うことができるnewunicodecharパッケージ、それに\defにおけるパターンマッチ風引数の取り方を組み合わせて、青空文庫の注記方式(|親文字《ルビ》という記法)に似たルビの 振り方ができるのではないかと思い付きました。

そこでこのようなマクロを作ってみました。
https://gist.github.com/hakuoku/3e235ef4a14282095e41e4ef30770a80

質問したいのは、ここから\x@my@rubyマクロにオプション引数を設定するにはどうしたらいいかということです。
最終的には|郭公《かっこう》[Jf]を、\ruby[Jf]{郭公}{かっこう}という形に展開したいです。(第三引数は省略可能)
原始的に

\def\x@my@ruby#1《#2》{\@ifnextchar[{\x@my@ruby@a}{\x@my@ruby@b}}

\def\x@my@ruby@a#1《#2》[#3]{\ruby[#3]{#1}{#2}}

\def\x@my@ruby@b#1《#2》{\ruby{#1}{#2}}


とするだけでは、

Argument of \x@my@ruby has an extra }.
<inserted text>
\par
l.36 |郭公《か���こう》

というエラーが出てしまいました。
省略可能なオプション引数を設定する方法について、ご教授頂けましたら幸いです。

(環境はWindows、質問時で最新のTeX Live、TeXWorksでLuaLaTeXを走らせています)
斎藤 漁火 への返信

Re: \defにおけるオプション引数について

- 飯島 徹 の投稿
\x@my@rubyの定義で \x@my@ruby@a および \x@my@ruby@b に引数を渡し忘れているようです
次のようにすると思い通りの結果になると思われます

\def\x@my@ruby#1《#2》{\@ifnextchar[{\x@my@ruby@a#1《#2》}{\x@my@ruby@b#1《#2》}}

\@ifnextchar の第3引数は直接 \ruby{#1}{#2} でもいいかも
\def\x@my@ruby#1《#2》{\@ifnextchar[{\x@my@ruby@a#1《#2》}{\ruby{#1}{#2}}}
飯島 徹 への返信

Re: \defにおけるオプション引数について

- 斎藤 漁火 の投稿
ありがとうございます!ご指摘通り、引数を渡すことで解決しました。(後者の、直接\ruby{#1}{#2}を入れるやり方ではIllegal parameter numberのエラーが出てしまいましたが
初歩的な質問で失礼いたしました。

飯島 徹 への返信

Re: \defにおけるオプション引数について

- 斎藤 漁火 の投稿
先程の投稿は当方の早とちりで、後者の直接 \ruby{#1}{#2} を指定する方法でも無事通りました。失礼しました。