
He estado usando algo como
\renewcommand\vec[1] {\boldsymbol{\MakeLowercase{#1}}}
\newcommand\mat[1] {\boldsymbol{\MakeUppercase{#1}}}
desde hace algún tiempo para componer vectores y matrices. Sin embargo, cada vez que surge esto cuando preguntoa pregunta, la gente me dice que es mala idea usarlo \Makeuppercase
en modo matemático. Además, \Makeuppercase
para mí está bastante roto.en este punto, por lo que podría necesitar una alternativa.
Para esta alternativa, estaba pensando que sería suficiente si pudiera emitir una advertencia cuando se use un símbolo en minúscula para matrices (o un símbolo en mayúscula para vectores). Sé cómo emitir una advertencia usando \@warning
o \GenericWarning
, pero no sé cómo probar si algo está en minúsculas o mayúsculas.
Además, ¿sería esta realmente una mejor manera de imponer una composición tipográfica consistente de vectores y matrices como se describe anteriormente o debería considerar algo completamente diferente?
Apéndice
Debido a que todo el mundo sigue comentando lo mala idea que es aplicar mayúsculas y minúsculas en modo matemático, siento que debo enfatizar que soy consciente de estas preocupaciones y este es mi intento de encontrar una solución. Mi principal preocupación es que los comandos que tenía me ayudaron a mantener mi notación consistente y la semántica de mi código LaTeX clara y preferiría mantener esta consistencia de alguna manera.
Para dar un ejemplo, un conjunto típico de ecuaciones con el que trabajo es el siguiente:
\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*}
Ahora, dependiendo del contexto, podría ser útil/necesario escribir esto de la siguiente manera:
\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*}
En estas transformaciones sucede a menudo que paso por alto la capitalización de una o más variables. Debido a que estas ecuaciones se alinean bastante bien, sería fácil detectarlas en el resultado, pero también sucede que no es visible de inmediato. Encuentro que los comandos \vec
y \mat
hacen que el núcleo de LaTeX sea más legible y cuando reviso las fórmulas me resulta más fácil concentrarme en esos comandos que en el caso real de cada variable. Simplemente me gusta creer que no hay nada malo en utilizar la tecnología para compensar mis defectos.
Dicho esto, estoy de acuerdo en que hacer cumplir el caso no es lo mejor que se puede hacer. Por lo tanto, ahora estoy buscando una solución que me notifique cuando el caso no coincide con lo que espero para un vector/matriz para no tener que hacer la verificación manualmente.
Respuesta1
Compruebe si el argumento es el mismo que su versión en minúsculas/mayúsculas. Si difieren, emita una advertencia.
\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}
Con este código obtendrías
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
en el archivo de registro y en la terminal, pero la salida será correcta de todos modos.
Respuesta2
Puede recuperar el código de carácter `[char]
y compararlo con \ifnum
. Las mayúsculas en latín son 65-90 y las minúsculas son 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}
Resultado:
Una versión más sólida que verifica los rangos reales y puede manejar argumentos predefinidos en lugar de caracteres literales, usando 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}
Ajusté un poco la lógica de las comprobaciones de modo que se permitan stringstrings
argumentos no alfabéticos como \delta
y , y las macros solo verifican el primer carácter, por lo que cosas como también están bien para una matriz (pero no lo están).1
X'
x'
La verificación ahora es: si el primer carácter no es alfabético, imprima siempre; de lo contrario, verifique si el primer carácter está en mayúscula, luego rechace para un vector y acepte para una matriz. Tenga en cuenta que cambié los nombres de las macros porque \vec
ya están definidas.
También moví el modo matemático fuera del comando, lo cual funciona bien. Utilicé \text
from amsmath
para el mensaje, pero imagino que debería ser real \GenericWarning
y luego \text
no es necesario.
\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}