Q&A 마당은 텍 관련 질문/답변을 위해 만들었습니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- 질문 전에 아래를 읽어 보세요. 좋은 질문이 좋은 답을 받을 수 있는 좋은 방법입니다.
- 질문에 맞는 제목을 붙이세요. 질문의 내용과 관련없는 "고수님", "긴급질문", "도와주세요"와 같은 제목은 답이 잘 올라오지 않습니다. 이 게시판에 올라오는 모든 글은 질문입니다. 굳이 [질문], [Q]를 적으실 필요도 없습니다.
- 내용을 충실히 적어 주시고, 같은 상황을 재현할 수 있는 최소한의 예제가 같이 있어야 합니다.
- 최소 예제는 "Minimal working example"을 읽어 보세요.
- 파일을 첨부하실 때에는 가능한 압축하여 파일 크기를 줄여서 올려주시길 바랍니다.
- 개인적으로 사용하신 글꼴이 들어 있는 경우, preparefont.sty에 관한 답변을 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 사용하는 편집기는 CKeditor입니다.
- 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한 줄을 비웁니다.
- 글줄만 바꾸려면 [shift-enter]를 누르면 <BR> 태그가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
- 수식를 문서내에 삽입하시려면 에디터를 툴바에서 [소스]를 눌러 HTML로 입력할 수 있게 바꾸신 후 <pre> </pre> tag를 사용하셔서 <pre> 여러 줄의 수식 </pre>처럼 입력하시면 좋습니다.
environ 대신 expl3로 하자면?
2015.05.14 16:05
\newif\ifextra\extratrue
\newcommand\extra[1]{\ifextra #1\fi}
이와 같이 작동하는 환경을 만들고 싶을 때, 환경 안에 온 내용이 조건식에 따라 식자되거나 말거나 해야 하는데요.
이를 구현할 수 있는 방법이, 제가 아는 범위에서, environ 말고 딱히 없습니다.
\NewEnviron{Extra}{\extra{\BODY}}
혹 expl3에 environ 패키지 대신할 것이 있나요?
댓글 5
-
nanim
2015.05.14 20:20
-
yihoze
2015.05.15 08:34
명쾌한 답변 고맙습니다.
-
nanim
2015.05.15 11:39
말씀하신 문제를 간단히 구현해봤습니다. 핵심은 일정 조건 하에서 환경의 내용이 안 나오게 하면 되는 거죠?
만약 환경의 내용 (\BODY)을 가지고 이런저런 조작을 가해야 한다면 결코 쉬운 문제가 아니겠습니다만 그냥 무시하는 거라면...
아래 예에서는 환경의 옵션 인자로 off를 지정하면 내용이 표시되지 않도록 했습니다.
\ExplSyntaxOn
\NewDocumentEnvironment { test } { o }
{ \IfValueT { #1 }
{ \str_if_eq:nnT { #1 } { off } { \hz_absorb_start: } }
}
{ \hz_absorb_stop: }
\cs_new:Nn \hz_absorb_stop:
{ \scan_stop: }
\cs_new:Nn \hz_absorb_start:
{ \hz_absorb_fn:n }
\cs_new:Npn \hz_absorb_fn:n #1
{ \tl_if_eq:NNTF #1 \end { #1 } { \hz_absorb_fn:n } }
\ExplSyntaxOff
다음처럼 사용할 수 있습니다.\begin{test}1. \lipsum[1]\end{test}\begin{test}[off]2. \lipsum\end{test}\begin{test}[on]3. \lipsum[2]\end{test} -
nanim
2015.05.15 12:25
그런데... 10여년 전에 이 비슷한 문제로 comment 패키지의 \comment를 쓰는 해법을 말씀하신 분이 hoze님 아니셨던가요?
기억이 가물가물...
-
yihoze
2015.05.15 13:32
\cs_new:Npn \hz_absorb_fn:n #1{ \tl_if_eq:NNTF #1 \end { #1 } { \hz_absorb_fn:n } }이게 핵심이군요."\end"가 나올 때까지 문자열들을(토큰들을) 오로지 무시하기 위해서 재귀적으로 비교하는군요.제 기억도 가물가물하지만 comment에 대해 제가 언급한 것이 맞는 것 같습니다.저는 왜, 멍청하게도, 그것을 제쳐 놓고 있었을까요?
아시는 대로 expl3는 "프로그래밍 언어"이고요, "환경"이라는 것을 expl3는 모릅니다.
("환경"은 LaTeX 특유의 것이니까 expl3에 있어야 할 이유가 별로 없습니다. xparse는 말 그대로 LaTeX에 해당하니까 그런 게 있겠습니다만.)
원하는 기능을 expl3로 구현하려면 (즉 environ 없이 하려면) 직접 expl3로 그런 동작을 하도록 설계하여 코딩하면 되리라고 생각합니다.
그렇지만 environ이 편리하니까 그걸 쓰시면 되겠고요. expl3의 수비범위에 들지 않는 문제이겠습니다.