数学コマンドで大文字の記号が使用されている場合に警告を発することはできますか?

数学コマンドで大文字の記号が使用されている場合に警告を発することはできますか?

私は次のようなものを使っています

\renewcommand\vec[1] {\boldsymbol{\MakeLowercase{#1}}}
\newcommand\mat[1]   {\boldsymbol{\MakeUppercase{#1}}}

ベクトルと行列をタイプセットするのに、しばらく前から取り組んできました。しかし、私が質問するたびに、1つの 質問\Makeuppercase数学モードで使うのは良くないと言われます。さらに、\Makeuppercase私にとってはかなり壊れていますこの時点でなので、代替案が必要になるかもしれません。

この代替案では、行列に小文字の記号が使用されている場合 (またはベクトルに大文字の記号が使用されている場合) に警告を発行できれば十分だと考えていました。 または を使用して警告を発行する方法はわかっています\@warning\GenericWarning、何かが小文字か大文字かをテストする方法がわかりません。

また、これは実際に、上記のようにベクトルと行列の一貫したタイプセットを強制するより良い方法でしょうか、それともまったく別の方法を検討すべきでしょうか?


補遺

数式モードで大文字と小文字を強制するのはいかに悪い考えかと皆がコメントし続けていることから、私はこれらの懸念を認識しており、これが回避策を見つけるための試みであることを強調する必要があると感じています。私の主な懸念は、私が持っていたコマンドが表記の一貫性を保ち、LaTeX コードのセマンティクスを明確に保つのに役立ったことであり、何とかしてこの一貫性を保ちたいと考えています。

たとえば、私が扱う典型的な方程式は次のようになります。

\begin{align*}
  \vec{f} &= \sigma(\mat{W}_\mathrm{fx} \vec{x} + \mat{W}_\mathrm{fh} \vec{h} + \vec{b}_\mathrm{f}) \\
  \vec{i} &= \sigma(\mat{W}_\mathrm{ix} \vec{x} + \mat{W}_\mathrm{ih} \vec{h} + \vec{b}_\mathrm{i}) \\
  \vec{s} &= \sigma(\mat{W}_\mathrm{sx} \vec{x} + \mat{W}_\mathrm{sh} \vec{h} + \vec{b}_\mathrm{s}) \\
  \vec{c} &\gets \vec{f} \odot \vec{c} + \vec{i} \odot \phi(\vec{s})
\end{align*}

さて、状況によっては、次のように書くことが便利/必要になるかもしれません。

\begin{align*}
  \mat{F} &= \sigma(\mat{X} \mat{W}_\mathrm{fx}^\mathsf{T} + \mat{H} \mat{W}_\mathrm{fh} + \vec{b}_\mathrm{f} \mat{1}) \\
  \mat{I} &= \sigma(\mat{X} \mat{W}_\mathrm{ix}^\mathsf{T} + \mat{H} \mat{W}_\mathrm{ih} + \vec{b}_\mathrm{i} \mat{1}) \\
  \mat{S} &= \sigma(\mat{X} \mat{W}_\mathrm{sx}^\mathsf{T} + \mat{H} \mat{W}_\mathrm{sh} + \vec{b}_\mathrm{s} \mat{1}) \\
  \mat{C} &\gets \mat{F} \odot \mat{C} + \mat{I} \odot \phi(\mat{S})
\end{align*}

これらの変換では、1 つ以上の変数の大文字化を見落とすことがよくあります。これらの式は非常にきれいに整列しているため、出力で簡単に見つけられるのですが、すぐには表示されないこともあります。コマンドを使用\vecする\matと、LaTeX コアが読みやすくなるため、数式を確認するときに、各変数の実際の大文字/小文字よりもこれらのコマンドに集中する方が簡単だと感じています。テクノロジーを使用して自分の欠点を補うことは何も悪いことではないと信じたいだけです。

そうは言っても、大文字と小文字を強制するのは最善の方法ではないことに同意します。したがって、現在、大文字と小文字がベクトル/行列の期待と一致しない場合に通知して、手動で確認しなくても済むようなソリューションを探しています。

答え1

引数が小文字/大文字バージョンと同じかどうかを確認します。異なる場合は警告を発します。

\documentclass{article}
\usepackage{amsmath}
\usepackage{bm}

\ExplSyntaxOn

\RenewDocumentCommand{\vec}{m}{\tsjolder_vec:n { #1 }}
\NewDocumentCommand{\mat}{m}{\tsjolder_mat:n { #1 }}

\msg_new:nnn { tsjolder/vec-mat } { wrong-case}
 {
  WARNING:~#1~used~when~#2~is~expected~\msg_line_context:
 }

\cs_new_protected:Nn \tsjolder_vec:n
 {
  \str_if_eq:eeTF { #1 } { \str_lowercase:n { #1 } }
   {
    \bm{#1}
   }
   {
    \msg_warning:nnnn { tsjolder/vec-mat } { wrong-case} { uppercase } { lowercase }
    \bm{\text_lowercase:n { #1 }}
   }
 }
\cs_new_protected:Nn \tsjolder_mat:n
 {
  \str_if_eq:eeTF { #1 } { \str_uppercase:n { #1 } }
   {
    \bm{#1}
   }
   {
    \msg_warning:nnnn { tsjolder/vec-mat } { wrong-case} { lowercase } { uppercase }
    \bm{\text_uppercase:n { #1 }}
   }
 }

\ExplSyntaxOn

\begin{document}

$\mat{a}\vec{B}$

\end{document}

このコードを使用すると

Package tsjolder/vec-mat Warning: WARNING: lowercase used when uppercase is
(tsjolder/vec-mat)                expected on line 41


Package tsjolder/vec-mat Warning: WARNING: uppercase used when lowercase is
(tsjolder/vec-mat)                expected on line 41

ログ ファイルとターミナルに表示されますが、出力はいずれにしても正しいものになります。

ここに画像の説明を入力してください

答え2

で文字コードを取得し`[char]、 と比較することができます\ifnum。大文字のラテン文字は 65 ~ 90、小文字は 97 ~ 122 です。

MWE:

\documentclass{article}
\def\vec#1{\ifnum`#1<97 #1 not lc!\else$\mathbf{#1}$\fi}
\def\mat#1{\ifnum`#1>90 #1 not uc!\else$\mathbf{#1}$\fi}

\begin{document}
\vec{X}

\vec{x}

\mat{X}

\mat{x}
\end{document}

結果:

ここに画像の説明を入力してください


実際の範囲をチェックし、リテラル文字の代わりに定義済みの引数を処理できる、より堅牢なバージョンstringstrings:

\documentclass{article}
\usepackage{stringstrings}
\def\vec#1{\testsolelylowercase{#1}\ifsolelylowercase$\mathbf{#1}$\else#1 not lc!\fi}
\def\mat#1{\testsolelyuppercase{#1}\ifsolelyuppercase$\mathbf{#1}$\else#1 not uc!\fi}

\begin{document}
\vec{X}

\vec{x}

\mat{X}

\mat{x}

% this one fails with the \ifnum code above
\def\myx{x}
\mat{\myx}
\end{document}

チェックのロジックをstringstrings少し調整して、 や などのアルファベット以外の引数が許可されるようにし\delta1マクロは最初の文字のみをチェックするようにしたので、 などの引数もマトリックスX'では許容されます (ただし はx'許容されません)。

現在のチェックは次のようになります: 最初の文字がアルファベット以外の場合は常に印刷し、それ以外の場合は最初の文字が大文字かどうかをチェックし、ベクトルの場合は拒否し、行列の場合は受け入れます。 は\vec既に定義されているため、マクロ名を変更したことに注意してください。

また、数式モードをコマンドの外側に移動しましたが、これは正常に動作します。メッセージに\textは from を使用しましたが、これは実際のものであるはずなので、 thenは必要ありません。amsmath\GenericWarning\text

\documentclass{article}
\usepackage{amsmath}
\usepackage{stringstrings}
\def\chkvec#1{%
   \testleadingalpha{#1}%
   \ifleadingalpha%
      \testcapitalized{#1}%
      \ifcapitalized%
         \text{vector argument } #1 \text{ starts with upper case!}%
      \else%
         \mathbf{#1}%
      \fi%
   \else%
      \mathbf{#1}%
   \fi}
\def\chkmat#1{%
   \testleadingalpha{#1}%
   \ifleadingalpha%
      \testcapitalized{#1}%
      \ifcapitalized%
         \mathbf{#1}%
      \else%
         \text{matrix argument }#1\text{ starts with lower case!}%
      \fi%
   \else%
      \mathbf{#1}%
   \fi}

\begin{document}
$\chkvec{X^2}$

$\chkvec{x^2}$

$\chkmat{X'}$

$\chkmat{x'}$

\def\myx{X}

$\chkmat{\myx}$

$\chkvec{\delta}$

$\chkvec{1}$
\end{document}

ここに画像の説明を入力してください

関連情報