
안녕하세요!
나는 stackechange 전체를 검색했지만 답을 찾을 수 없었습니다. 저는 Latex를 처음 접했기 때문에 접근 방식이 적절하지 않습니다. 그리스 문자 형식을 다음과 같이 지정하는 매크로를 정의하려고 합니다.똑바로 굵은. 나는 그것을 할 수 있는 여러 가지 방법이 있다는 것을 알고 있습니다. 나는 isomath의 사용을 피하고 다음을 고수하고 싶습니다.그리스의패키지.
나는 글을 쓸 수 있기를 원한다
\gb{\alpha}
\gb{\Alpha}
두 경우 모두 똑바로 굵은 문자를 얻습니다. 내부 코드는 다음과 같습니다.
\newcommand{\gb}[1]{ % Imagine #1=\Psi
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcodet] % variable "\Psi"
\StrGobbleRight{\chrcodet}{1}[\chrcode] % variable "Psi"
\StrLeft{\chrcode}{1}[\chrfirst] % first character "P"
\IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst} % Is it capital?
{\boldsymbol{#1}} % Yes - no modification
{\boldsymbol{\csname up\chrcode\endcsname}} % No - glue \up+Psi (that what happens!)
}
제어 시퀀스의 첫 번째 문자를 얻으려고 하는데 대문자인 경우 수정 없이 호출하고 , 그렇지 않으면 시작 부분에 \boldsymbol
배치하여 제어 시퀀스를 수정하고 싶습니다 . \up
그래서 그렇게 하면 다음과 같은 오류가 발생합니다.
! Undefined control sequence.
\bm@command ->\upPsi
"if" 조건은 항상 거짓인 것처럼 보입니다. 즉, "P"는 대문자로 인식되지 않으므로 다음 MWE에서는 "소문자"를 두 번 씁니다.
\documentclass{article}
\usepackage{bm,upgreek}
\usepackage{etoolbox}
\usepackage{xstring}
\newcommand{\gb}[1]{
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcodet]
\StrGobbleRight{\chrcodet}{1}[\chrcode]
\StrLeft{\chrcode}{1}[\chrfirst]
#1 - \IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst}{uppercase}{lowercase}
}
\begin{document}
\begin{equation}
\psi,\Psi,\gb{\psi},\gb{\Psi}
\end{equation}
\end{document}
누구든지 나에게 아이디어를 줄 수 있습니까? 왜 예상대로 작동하지 않습니까?
답변1
bm
더 이상 재정의하지 않고 그냥 하고 싶은 대로 하면 되지 않나요 ?
\documentclass{article}
\usepackage{bm,upgreek}
\begin{document}
\begin{equation}
\psi, \uppsi, \Psi,\bm{\psi},\bm{\uppsi},\bm{\Psi}
\end{equation}
\end{document}
답변2
David Carlisle에게 정말 감사드립니다!
catcodes에 대한 정확한 생각이었습니다. 경험이 부족해서 catcode에 대해 전혀 몰랐습니다. 시도를 해보니 나도 혼란스러웠다.etoolbox정상 (catcode 11)과 Detokenized (catcode 12) \ifstrequal
를 비교하는 함수를 사용 했는데 작동했습니다! 도구 상자의 소스 코드 내부를 살펴보기로 결정한 후 두 피연산자 모두에 적용되는 것을 발견했습니다. 그래서 비슷한 방식으로 매크로를 수정하여 이제 예상대로 작동합니다.P
P
\detokenize
매크로:
\documentclass{article}
\usepackage{bm,upgreek}
\usepackage{etoolbox}
\usepackage{xstring}
\newcommand{\gb}[1]{
\StrGobbleLeft{\detokenize{#1}}{1}[\chrcode]
\StrGobbleRight{\chrcode}{1}[\chrcode]
\StrLeft{\chrcode}{1}[\chrfirst]
\edef\tempa{\detokenize{ABCDEFGHIJKLMNOPQRSTUVWXYZ}}
#1 - no\;detokenize: \IfSubStr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\chrfirst}{upper}{lower}, \,
detokenize\;both: \IfSubStr{\tempa}{\chrfirst}{upper}{lower}, \,
etoolbox: \expandafter\ifstrequal\expandafter{\chrfirst}{P}{upper}{lower}
}
\begin{document}
\begin{equation}
\gb{\psi}
\end{equation}
\begin{equation}
\gb{\Psi}
\end{equation}
\end{document}
결과:
아마도 이것이 최선의 해결책은 아니며 제기된 문제에 효율적이지 않다고 생각하지만 유용한 경험이었습니다!