KTUG마당은 KTUG를 방문하는 모든 이용자가 대화를 나누고 소식을 전하는 곳입니다.

  • 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
  • Team Blog의 글을 이곳 게시판의 "정보글"로 모았습니다. Team blog는 기고자가 올린 글에 질문을 받는 부담을 줄이기 위하여 댓글을 허용하지 않았습니다. 그러나 이곳 게시판으로 모으면서 댓글을 달 수 있습니다. 게시물을 작성하실 때 댓글을 원하지 않으시면 댓글을 허용하시지 않으시기를 바랍니다. 또한 불필요한 소모성 댓글을 달지 않도록 주의하여 주시기를 바랍니다.
  • TeX과 관련된 질문이나 답변은 QnA 마당을 이용하십시오. TeX과 관련된 질문은 지웁니다
  • MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
  • 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
    • 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
  • 사용하는 편집기는 CKeditor입니다. 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한줄을 비웁니다. 글줄만 바꾸려면 shift-enter 를 누르시면 <BR>가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.

자유글 조건부 텍스트

2018.08.21 11:48

yihoze 조회 수:6287

kriss 님이 갖고 있는 문제
(http://www.ktug.org/xe/index.php?document_srl=231520&mid=KTUG_QnA_board), 조건부 텍스트를 구현하는 데에 \ifthenelse 같은 명령이 충분해 보이지 않습니다. 그 문제가 제가 고민했던 것과 비슷해 보여서 제가 expl3를 이용하여 만든 방법을 소개하고자 합니다.

일반 텍 사용자들이 expl3를 굳이 익힐 필요가 없다고 생각해 왔습니다. 그리고 텍이나 레이텍에 비해 이해하기가 좀 어렵기도 합니다.  왜냐하면  텍이나 레이텍 명령들은 단지 매크로 집합이기 때문에 필요한 만큼만 베껴 쓰면서 이해하고 응용하는 것으로 족하지만, expl3는 텍 프로그래밍 언어이기 때문에 기반 개념들을 전반적으로 이해해야 합니다. 좌우지간 expl3도 결국은 텍으로 만들어진 것입니다.

다시 조건부 텍스트 문제로 돌아와서, 한 가지 조건만 가려서 이것 또는 저것을 표현해야 한다면 boolean 변수를 사용하는 것만으로 족합니다. 하지만 여러 가지 조건을 써야 한다면 \newif 또는 \newboolean을 되풀이하여 쓰는 것이 성가시게 됩니다. 그래서 저는 조건들을 한두 명령만으로 제어할 수 있는 방법을 궁리했습니다.

예를 들어, A4로 조판할 때 또는 B5로 조판할 때 서로 다른 여백, 인쇄용으로 만들 때 재단선 포함하고 웹용으로 만들 때는 재단선 제외, 등등. 그런데 조건들이 서로 영향을 주는 경우도 있지만, 제가 예로 든 것과 같은 것들은 서로 무관합니다. 그래서 다음과 같은 형태로 적는 것만으로 충분하고 편할 것 같습니다.

\if{A}{ true ... }
\if{B}{ true ... }

때때로 "거짓"일 때 다르게 나타내야 할 수도 있습니다. 그것은 옵션 인자로 만드는 것이 편하겠습니다.

\if{A}{ true ...}[ false ... ]
\if{B}{ true ...}[ false ... ]

문제는 저 "A", "B" 같은 조건들을 어떻게 만들고 관리하느냐는 것입니다. 제 아이디어는 이렇습니다.

1) 조건들을 콤마 리스트 (콤마로 분리되는 목록 형태의 변수)에 넣는다. 하나 또는 둘 이상, 그리고 나중에 더 추가하는 것이 가능해야 한다.
2) 조어진 조건이 콤마 리스트에 포함되어 있으면 참 텍스트를, 거짓이라면 그리고 그 경우에 옵션 인자로 주어진 텍스트가 있다면 그것을 표시한다.

conditional_text.png

\documentclass{article}
\usepackage{xparse, expl3}
\usepackage{environ}
\usepackage{xcolor}

\def\True{Wovon man nicht sprechen kann, darüber muß man schweigen.}
\def\False{About that, of which one cannot speak, one must remain silent.}
\ExplSyntaxOn
\clist_new:N \g_content_type 
\NewDocumentCommand \SetContentType { m } {
    \clist_gput_right:Nn \g_content_type {#1} %인자를 콤마 리스트 변수에 계속 추가
}

\NewDocumentCommand \IfContentType { m +m o }{
    \bool_set_false:N \g_tmpa_bool % "_tmpa_" 또는 "_tmpb_"가 붙은 것들은 사용자를 위해 expl3에 정의되어 있는 변수
    \clist_map_inline:Nn \g_content_type % 변수에 포함된 낱말들을 하나씩 꺼내어
    {
        \str_if_eq:nnT {##1}{#1} % 인자와 비교하여
        { 
            \bool_set_true:N \g_tmpa_bool % 같으면 "참"으로 설정
        }
    }
    \bool_if:NTF \g_tmpa_bool %"참"이면 이것
    { 
        \group_begin:
            \color{blue} #2 
        \group_end:
    }{
        \IfValueT { #3 } %"거짓"인데 옵션 인자가 있다면 이것
        { 
            \group_begin:
                \color{gray} #3 
            \group_end:
        } 
    }    
}
\NewEnviron{IfThisType}[1]{ %환경으로 쓰고 싶다면, 대신 옵션 인자는 사용 불가
    \IfContentType{#1}{\BODY}
}
\ExplSyntaxOff

\begin{document}

\SetContentType{question} 
\SetContentType{answer, explanation}

% question이 변수에 포함되어 있으므로 true
\IfContentType{question}{\True}

% query가 변수에 포함되어 있지 않으므로 false
\IfContentType{query}{\True}[\False] 

% answer가 변수에 포함되어 있으므로 true
\begin{IfThisType}{answer}
\True
\end{IfThisType}

% response가 변수에 포함되어 있지 않으므로 무시
\begin{IfThisType}{response} 
\True
\end{IfThisType}

\end{document}

번호 제목 글쓴이 날짜 조회 수
810 TeXLive 2011 좀 간단하게 설치하고 쓰기 (Windows) karnes 2011.10.27 5238
809 KTUG 10주년 기념 모임 [22] file Progress 2011.10.30 40780
808 이쯤에서 다시 읽어보는 옛날 글 ^^ [2] nova de hi 2011.11.01 36045
807 KTUG 10주년을 기념하여, KTUG와 첫 인연이었던 글을 찾아보면? [3] file 샘처럼 2011.11.02 38779
806 사랑하는 progress님.. 아직도 삐치셨나.. ㅡ.ㅜ~ [1] 2011.11.03 37655
805 TeX의 아름다움을 느끼며.... [1] 2011.11.03 31521
804 텍관리자님 메일 문제 [2] z0nam 2011.11.15 27901
803 킨들 파이어 첫날 소감. [5] 양사장 2011.11.19 39669
802 [공지] spam 댓글로 발생하는 문제를 개선하기 위하여 초기화면의 게시글 정렬순서를 변경합니다. [3] 관리자 2011.11.21 56087
801 쓸만한 LaTeX 관련 문서 소개 두텁 2011.11.23 4843
800 프레임 문단에 관한 잡담 file karnes 2011.12.16 5352
799 KoPub 서체 공개 ( 문화체육관광부와 한국출판인회의 ) [1] 샘처럼 2011.12.27 49998
798 한글과컴퓨터 한컴의 오피스뷰어 (Office Viewer) 이용 라이센스 변경 에드 2011.12.28 25394
797 KTUG 여러분 [3] Progress 2011.12.30 21918
796 KTUG Companion 에드 2012.01.05 27727
795 A4 용지를 꽉 채우는 판면 karnes 2012.01.09 5767
794 Texmaker 3.2.2 update [3] 에드 2012.01.16 33006
793 회원가입승인요청 [2] latex장갑 2012.01.18 21579
792 인자를 verbatim으로 찍는 명령 file karnes 2012.01.19 4960
791 2012 한국텍학회 학술대회 및 정기총회 [3] 관리자 2012.01.25 89595



XE Login