Kann ich eine Warnung ausgeben, wenn in meinem Mathematikbefehl ein Großbuchstabe verwendet wird?

Kann ich eine Warnung ausgeben, wenn in meinem Mathematikbefehl ein Großbuchstabe verwendet wird?

Ich habe so etwas verwendet wie

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

seit einiger Zeit, um Vektoren und Matrizen zu setzen. Allerdings kommt dies jedes Mal zur Sprache, wenn ich frageA Frage, die Leute sagen mir, es sei eine schlechte Idee, es \Makeuppercaseim Mathe-Modus zu verwenden. Außerdem \Makeuppercaseist es für mich ziemlich kaputtan dieser Stelle, also brauche ich möglicherweise eine Alternative.

Für diese Alternative dachte ich, es würde ausreichen, wenn ich eine Warnung ausgeben könnte, wenn ein Kleinbuchstabe für Matrizen (oder ein Großbuchstabe für Vektoren) verwendet wird. Ich weiß, wie man mit \@warningoder eine Warnung ausgibt \GenericWarning, aber ich kann nicht herausfinden, wie man prüft, ob etwas klein- oder großgeschrieben ist.

Wäre dies außerdem tatsächlich eine bessere Möglichkeit, einen konsistenten Schriftsatz von Vektoren und Matrizen wie oben beschrieben durchzusetzen, oder sollte ich etwas völlig anderes in Betracht ziehen?


Nachtrag

Da alle immer wieder kommentieren, wie schlecht die Idee ist, im Mathematikmodus Groß- und Kleinschreibung zu erzwingen, muss ich betonen, dass ich mir dieser Bedenken bewusst bin und dies mein Versuch ist, eine Problemumgehung zu finden. Mein Hauptanliegen ist, dass die Befehle, die ich hatte, mir geholfen haben, meine Notation konsistent und die Semantik meines LaTeX-Codes klar zu halten, und ich würde es vorziehen, diese Konsistenz irgendwie beizubehalten.

Um ein Beispiel zu geben: Ein typischer Gleichungssatz, mit dem ich arbeite, sieht wie folgt aus:

\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*}

Nun kann es je nach Kontext sinnvoll/notwendig sein, dies wie folgt zu schreiben:

\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*}

Bei diesen Transformationen kommt es häufig vor, dass ich die Groß- und Kleinschreibung einer oder mehrerer Variablen übersehe. Da diese Gleichungen recht gut ausgerichtet sind, wäre es in der Ausgabe leicht zu erkennen, aber es kommt auch vor, dass es nicht sofort sichtbar ist. Ich finde, dass die Befehle \vecund \matden LaTeX-Kern lesbarer machen, und wenn ich die Formeln überprüfe, fällt es mir leichter, mich auf diese Befehle zu konzentrieren als auf die tatsächliche Groß- und Kleinschreibung jeder Variable. Ich glaube einfach gerne, dass es nichts Falsches ist, Technologie zu verwenden, um meine Unzulänglichkeiten auszugleichen.

Allerdings stimme ich zu, dass es nicht das Beste ist, die Groß-/Kleinschreibung zu erzwingen. Daher suche ich jetzt nach einer Lösung, die mich benachrichtigt, wenn die Groß-/Kleinschreibung bei einem Vektor/einer Matrix nicht mit meinen Erwartungen übereinstimmt, sodass ich die Überprüfung nicht manuell durchführen muss.

Antwort1

Überprüfen Sie, ob das Argument mit der Version in Klein- bzw. Großbuchstaben übereinstimmt. Wenn es Unterschiede gibt, geben Sie eine Warnung aus.

\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}

Mit diesem Code erhalten Sie

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

in der Protokolldatei und auf dem Terminal, aber die Ausgabe ist trotzdem korrekt.

Bildbeschreibung hier eingeben

Antwort2

Sie können den Zeichencode mit abrufen `[char]und mit vergleichen \ifnum. Lateinische Großbuchstaben sind 65-90 und Kleinbuchstaben sind 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}

Ergebnis:

Bildbeschreibung hier eingeben


Eine robustere Version, die die tatsächlichen Bereiche prüft und vordefinierte Argumente statt wörtlicher Zeichen verarbeiten kann, verwendet 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}

Ich habe die Logik der stringstringsPrüfungen ein wenig angepasst, so dass nicht-alphabetische Argumente wie \deltaund 1zulässig sind und die Makros nur das erste Zeichen prüfen, sodass Dinge wie X'auch für eine Matrix in Ordnung sind (aber x'nicht sind).

Die Prüfung lautet jetzt: Wenn das erste Zeichen nicht alphabetisch ist, dann immer drucken, andernfalls prüfen, ob das erste Zeichen groß geschrieben ist, dann bei einem Vektor ablehnen und bei einer Matrix akzeptieren. Beachten Sie, dass ich die Makronamen geändert habe, da \vecsie bereits definiert sind.

Außerdem habe ich den Mathematikmodus außerhalb des Befehls verschoben, was gut funktioniert. Ich habe \text„from“ amsmathfür die Nachricht verwendet, aber ich nehme an, dass dies ein tatsächliches sein sollte \GenericWarningund dann \textnicht benötigt wird.

\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}

Bildbeschreibung hier eingeben

verwandte Informationen