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

  • 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
  • TeX과 관련된 질문이나 답변은 QnA 마당을 이용하십시오. TeX과 관련된 질문은 지웁니다
  • MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
  • 최근 스팸글의 등록 빈도가 높아 졌습니다. 이를 막기위하여 짧은 시간내에 다시 글이 등록되는 IP를 막거나, 광고글을 막기위하여 금지어로 .com, .net등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
  • 사용하는 편집기를 스마트에디터에서 CKeditor로 변경하였습니다. 좋아진 점은 아래와 같습니다.
    • flash를 사용하지 않습니다.
    • 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한줄을 비웁니다. 글줄만 바꾸려면 shift-enter 를 누르시면 <BR>가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.

조건부 텍스트

2018.08.21 11:48

yihoze 조회 수:672

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}

번호 제목 글쓴이 날짜 조회 수
공지 [안내] 2018 한국텍학회 정기총회 및 학술대회 [9] yihoze 2018.01.01 3673
공지 KTUG 사설저장소 브라우저 베이드프즈 2017.07.16 2785
공지 장애 복구 안내 [9] 관리자 2017.05.04 3193
공지 TeX Live 2016 설치 안내 [7] 관리자 2016.06.05 27801
715 [expl3] string의 permutation [4] file noname 2018.12.09 111
714 좀 오래 됐지만 (올 봄) TeX으로 만든 작업물 하나 올려 봅니다 [3] file Dennis 2018.12.02 188
713 ClutTeX 소개 [1] 지나가던 2018.12.05 121
712 MathJax를 이용하여 웹에서 수식을 써 봅시다 [23] file 샘처럼 2010.12.29 124191
711 [luatex] 행운의 번호는? [13] file yihoze 2018.11.23 308
710 emacs 에서 한글을 세팅하는 간단한 방법입니다. [6] 불량양파 2017.02.11 1029
709 오늘 정말 감사했습니다. [2] file 불량양파 2018.11.17 196
708 hwp2tex 테스트 [1] file Progress 2018.11.19 300
707 VSCode + LaTeX 확장 + 단축키(아래아한글같은) [1] file Kriss 2018.11.17 226
706 노래의 탄생 (obiphone 클래스와 graphicsonthefly 패키지 사용례) [1] file Progress 2018.11.18 153
705 [참가신청] 문서작성 워크숍 2018 [1] ischo 2018.10.22 903
704 저... 왜 이랬을까요.... 후우... [4] 불량양파 2018.11.10 232
703 [exp3] 조합(combination) <연분수보다 말도 못하게 쉬운> [7] file yihoze 2018.10.26 398
702 [expl3] 진법변환 나누기 [2] file noname 2018.11.06 150
701 [사전공지] 문서작성워크숍 2018 [2] ischo 2018.10.16 374
700 [expl3] 런닝맨 삼육구 [6] noname 2018.10.03 455
699 [expl3] 연분수 조판 revisited [7] file noname 2018.09.25 575
» 조건부 텍스트 [6] file yihoze 2018.08.21 672
697 워드, 인디자인, 그리고 레이텍 [1] yihoze 2018.08.28 616



XE Login