
나는 만들고 싶다표현식이 완전히 확장 가능한지 확인하고 그렇지 않으면 충돌이 발생하는 명령(이상적으로는 오류 메시지 인쇄) 나는 그것을하고 싶습니다특정 TeX 엔진을 염두에 두지 않고. 내 생각엔 이 질문과 관련이 있는 것 같아매크로가 완전히 확장 가능한지 확인하세요., 그러나 제공된 답변에는 LuaTeX가 필요합니다.
테스트 코드
테스트 코드는 다음과 같습니다.
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xparse}
\usepackage{xstring}
\NewDocumentCommand{\checkexpandability}{m}{
% CODE HERE
}
\newcommand{\expandable}[1]{#1}
\newcommand{\notexpandable}[1]{%
\edef\myvariable{\expandable{#1}}%
\myvariable%
}
\begin{document}
\checkexpandability{\expandable{test}} % Should be OK
\checkexpandability{\notexpandable{test}} % Should CRASH
\checkexpandability{\IfBeginWith{string}{str}{true}{false}} % Should CRASH
\end{document}
너무 복잡한 경우
가능하지 않은 경우 명령이 확장되어야 하는 매개변수를 포함하도록 명령 서명을 수정해도 됩니다.
\begin{document}
\checkexpandability{\expandable{test}}{test} % Should be OK
\checkexpandability{\notexpandable{test}}{test} % Should CRASH
\checkexpandability{\IfBeginWith{string}{str}{true}{false}}{true} % Should CRASH
\end{document}
확장성에 대한 설명
완전히 확장 가능하다는 정의는 생각만큼 명확하지 않기 때문에(아래 설명 참조) 이 질문의 맥락은 일부 코드를 디버깅하는 데 도움이 되는 무언가를 만들려고 한다는 것입니다. 질문을 다음 특정 동작으로 제한해도 괜찮습니다. 매크로가 다음 \color
명령과 같은 컨텍스트 매크로에서 작동하는지 여부입니다.
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xcolor}
\newcommand{\expandable}[1]{#1}
\newcommand{\notexpandable}[1]{%
\edef\myvariable{\expandable{#1}}%
\myvariable%
}
\begin{document}
\color{\expandable{blue}} % OK
\color{\notexpandable{red}} % CRASHES
X
\end{document}
기본적으로 이 명령은 내가 찾고 있는 종류의 작업을 수행합니다. 단지 이 명령을 호출 하고 좀 더 일반적인 방식으로 멋진 오류 메시지를 인쇄하고 \color
싶을 뿐입니다 .\checkexpandability
답변1
제가 생각하는 근본적인 오해는
기본적으로 이
\color
명령은 내가 찾고 있는 작업을 수행합니다.
이 \color
명령은 요청된 유형을 확인하지 않으며 확장 후 인수가 정의된 색상 이름일 것으로 예상합니다. 확장이 실패하면 낮은 수준의 오류가 발생하거나 정의되지 않은 색상으로 확장되면 특정 오류 메시지가 표시되지만 처리의 어떤 부분도 일반적이거나 색상을 기대하는 명령 이외의 명령에 적용되지 않습니다.
구현할 수 있는 버전 중 하나는 확장 후 두 인수가 동일한지 간단히 묻는 확장이 예상되는 버전입니다. L3 프로그래밍 계층에는 여러 가지 변형이 있거나 패키지를 사용할 수 ifthen
있으며
\ifthenelse{\equal{\expandable{test}}{test}}{yes}{no}
인수가 동일한 것으로 확장되면 yes를 반환하고 그렇지 않으면 no를 반환하거나 인수가 확장 컨텍스트에서 안전하지 않은 경우(일반적으로 "확장할 수 없음"을 의미함) 낮은 수준의 오류를 반환합니다.
답변2
코드를 디버깅하려면 \typeout
.
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xcolor}
\newcommand{\expandable}[1]{#1}
\newcommand{\notexpandable}[1]{%
\edef\myvariable{\expandable{#1}}%
\myvariable%
}
\begin{document}
\typeout{\expandable{blue}} % OK, print "blue"
\typeout{\notexpandable{red}} % CRASHES
X
\end{document}
요점은 \typeout
인수를 완전히 확장한 다음 터미널에 완전히 확장된 결과를 인쇄한다는 것입니다. 따라서 터미널을 살펴볼 수 있습니다.
첫 번째 경우에는 가 인쇄되므로 blue
모든 것이 정상입니다. 두 번째 경우에는 충돌이 발생합니다.
물론 위의 접근 방식에는 두 가지 문제가 있습니다.
설사
\expandable{blue}
~이다완전히 확장 가능(무엇을 의미하든)\color
결과를 색상으로 해석하기 전에 인수를 완전히 확장하는 것이 보장 되지 않을 수도 있습니다.. (아마도하이럼의 법칙그러나 실제로는 "기존 패키지"가 손상되는 것을 방지하는 것입니다.)따라서 더욱 확실하게 하려면 다음을 사용하여 미리 확장하는 것이 좋습니다.
\ExpandArgs
.범주 코드에 대한 정보는 물론 코드에 숨어 있는 특수 문자(예: 공백 또는 탭)도 손실됩니다.
실제로 이것은 크게 중요하지 않지만 때로는 그렇습니다. (예: 환경 본문을 그대로 캡처하려고 시도하는 일부 패키지를 디버그하려고 할 때)
그렇다면 한번 시도해 보세요.내 패키지. (현재 코드는 엉망이지만 잘 작동합니다. 그리고 더 나쁜 소스 코드가 있는 패키지도 있습니다)