
나는 다음과 같은 것을 사용하고 있습니다
\renewcommand\vec[1] {\boldsymbol{\MakeLowercase{#1}}}
\newcommand\mat[1] {\boldsymbol{\MakeUppercase{#1}}}
한동안 벡터와 행렬을 조판하려고 노력했습니다. 그런데 내가 물어볼 때마다 이런 말이 나올 때마다ㅏ 질문\Makeuppercase
, 사람들은 수학 모드에서 사용하는 것이 좋지 않다고 말합니다 . 게다가, \Makeuppercase
나에게는 꽤 많이 망가졌습니다.이 지점에서, 그래서 대안이 필요할 수도 있습니다.
이 대안에서는 행렬에 소문자 기호(또는 벡터에 대문자 기호)가 사용될 때 경고를 발행할 수 있으면 충분할 것이라고 생각했습니다. \@warning
or 를 사용하여 경고를 발행하는 방법을 알고 있지만 \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*}
이러한 변환에서 하나 이상의 변수의 대문자 사용을 간과하는 경우가 종종 발생합니다. 이러한 방정식은 매우 잘 정렬되므로 출력에서 쉽게 찾을 수 있지만 즉시 표시되지 않는 경우도 있습니다. 나는 \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
약간 조정했으며 매크로는 첫 번째 문자만 확인하므로 다음과 같은 것도 행렬에 대해 괜찮습니다(그러나 그렇지 않습니다).\delta
1
X'
x'
이제 확인 방법은 다음과 같습니다. 첫 번째 문자가 알파벳이 아니면 항상 인쇄하고, 그렇지 않으면 첫 번째 문자가 대문자인지 확인한 다음 벡터를 거부하고 행렬을 허용합니다. 매크로 이름은 \vec
이미 정의되어 있으므로 변경했습니다.
또한 수학 모드를 명령 외부로 옮겼는데 잘 작동합니다. 나는 메시지에 \text
from을 사용했지만 이것이 실제 이어야 하고 필요하지 않다고 생각합니다.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}