後続の文字による条件分岐

後続の文字による条件分岐

- Ryuta Kudo の投稿
返信数: 7

明けましておめでとうございます。
新年早々質問失礼します。

やりたいこと

\myabs{\vec{x}} \myabs{\vec{y}} \myabs{\vec{z}}

のように入力した際、

\lvert \vec{x} \rvert \, \lvert \vec{y} \rvert \, \lvert \vec{z} \rvert

と同等の出力になり、

\myabs{\vec{x}}y

と入力した際は

\lvert \vec{x} \rvert y

と同等の出力となるようなマクロ(コマンドと呼ぶべきかもしれません)\myabsを作成したい。

※ 言い換えれば、絶対値記号が連続(\lvertと\rvertが連続)したときのみ、その間に\,を挿入したいです。

現状

後続の文字(文字と呼んでいいのか分かりませんが)が\rvertであるかを判定し、\rvertであるときのみフラグを立てて、条件分岐により\,の挿入・非挿入を制御しようと考えましたが、そもそも「後続の文字の判定」方法が、調べ方が悪いのか、情報を見つけられず頓挫しています

質問内容から類推できるかもしれませんが、LaTeX歴は半年程度、TeX言語は勉強し始めて2か月ほどの初心者です。 私の知識量では限界を感じ、質問させていただきました。よろしくお願いします。

Ryuta Kudo への返信

Re: 後続の文字による条件分岐

- ut の投稿
> 後続の文字による条件分岐

ということであれば、そのものずばりの名前の「\@ifnextchar」というのがありますけれど、でも、以下のような単純なものでは、

> 絶対値記号が連続(\lvertと\rvertが連続)したときのみ、その間に\,を挿入したい

というご要望には応えられていませんね…:

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\myabs}[1]{\@ifnextchar\myabs{\lvert#1\rvert\,}{\lvert#1\rvert}}
\makeatother

\begin{document}

$\lvert \vec{x} \rvert \, \lvert \vec{y} \rvert \, \lvert \vec{z} \rvert$

$\myabs{\vec{x}} \myabs{\vec{y}} \myabs{\vec{z}}$

$\lvert \vec{x} \rvert y$

$\myabs{\vec{x}}y$

\bigskip

$\lvert \vec{x} \rvert \lvert \vec{y} \rvert \lvert \vec{z} \rvert$

$\lvert \vec{x} \rvert \, \lvert \vec{y} \rvert \, \lvert \vec{z} \rvert$

$\left\lvert \vec{x} \right\rvert
\left\lvert \vec{y} \right\rvert
\left\lvert \vec{z} \right\rvert$

\end{document}
ut への返信

Re: 後続の文字による条件分岐

- Ryuta Kudo の投稿

utさん

回答ありがとうございます。\if@nextcharというものがあるのですね。 インターネット検索では、検索ワードが悪かったのかヒットしませんでしたが、確かに手元の資料を見てみると載っていました。 勉強不足でお恥ずかしいです。

\makeatletter
\newcommand{\myabs}[1]{\@ifnextchar\myabs{\lvert#1\rvert\,}{\lvert#1\rvert}}
\makeatother

これは、後続が\myabsであれば\myabs\lvert#1\rvert\,に、後続が\myabs以外であれば\lvert#1\rvertに…といった挙動になるという理解で正しいでしょうか。

P.S.

人違いでしたら申し訳ないのですが、TeX & LaTeX Advent Calendar 2022に寄稿なさっていましたか?

そうであれば、TeX & LaTeX Advent Calendar 2022の記事、楽しく読ませていただきました。 ありがとうございます。

Ryuta Kudo への返信

Re: 後続の文字による条件分岐

- ut の投稿
> 勉強不足でお恥ずかしいです。

いえいえ、「LaTeX歴は半年程度」なら、\@ifnextchar なんてご存じなくても何の不思議もありません。

\@ifnextchar は LaTeX の内部コマンドなので、ご紹介するのは本当はいけないのかも知れませんが、かと言って \futurelet を直接使って \@ifnextchar 相当の機能を自前で実現するのは大変そうです。

\NewDocumentCommand が使えたらよかったのですが、\@ifstar と同等の機能はあるみたいですけれど、\@ifnextchar と同じようには(私には)できなかったので、結局 \@ifnextchar を持ち出してしまいました。

> 確かに手元の資料を見てみると載っていました。

何に載っていましたか? 逆に私は、お勧めできるような適当なドキュメントが思い付かないのですが。

> これは、後続が\myabsであれば\myabsは … といった挙動になるという理解で正しいでしょうか。

「挙動」についてどの程度まで正確に表現するかによりますが、概ね、そんな感じのつもりです。

> …記事、楽しく読ませていただきました。

あらら、そんな、こちらこそありがとうございます。
(中級以上のみなさんにとっては「相変わらず長いばっかりで目新しさに欠ける」内容だったと思われるのですが)
ut への返信

Re: 後続の文字による条件分岐

- Ryuta Kudo の投稿
utさん

> 何に載っていましたか?

吉永徹美『独習LaTeX2e』にて記載がありました。

> あらら、そんな、こちらこそありがとうございます。
> (中級以上のみなさんにとっては「相変わらず長いばっかりで目新しさに欠ける」内容だったと思われるのですが)

自分のような初心者にとってはむしろ``真新しい''ことばかりで、知らない世界を垣間見ることができ、興味を持つことができました。
ありがとうございました。
Ryuta Kudo への返信

Re: 後続の文字による条件分岐

- ut の投稿
Ryuta Kudo さん

お返事をありがとうございます。

> > 何に載っていましたか?
>
> 吉永徹美『独習LaTeX2e』にて記載がありました。

恐らく、現在入手可能な(日本語の)LaTeX の本では、一番詳しい(かつ正確な)ものですよね。

私は整理ができないたちで、持ってるはずの本でも見つからないと、探すよりも買い直したほうが早いと思って、同じ本を何回も買ってしまうのですが、たまたま『独習 LaTeX2e』も去年の 6 月に買い直していたので、今回はすぐに見つけることができました(amazon の履歴をチェックしたところ、最初に買ったのは 2008 年 3 月 17 日でした)。

確かに「11.7 後続の文字の検査」という、ピッタリな見出しの下に解説がされてますね。

ついつい、オンラインで参照できるドキュメントばかりを追ってしまいがちですが、やはり、ちゃんとした本を手元においておくのは大事なんだな、ということをこの度のやりとりで改めて教えていただきました(ありがとうございます)。
Ryuta Kudo への返信

Re: 後続の文字による条件分岐

- Ryuta Kudo の投稿

「現状」の項に誤記がありました。\rvertではなくlvertでした。訂正して再掲します。

現状

後続の文字(文字と呼んでいいのか分かりませんが)が\lvertであるかを判定し、\lvertであるときのみフラグを立てて、条件分岐により\,の挿入・非挿入を制御しようと考えましたが、そもそも「後続の文字の判定」方法が、調べ方が悪いのか、情報を見つけられず頓挫しています