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

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

조건부 텍스트

2018.08.21 11:48

yihoze 조회 수:317

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 한국텍학회 정기총회 및 학술대회 [8] yihoze 2018.01.01 2279
공지 KTUG 사설저장소 브라우저 베이드프즈 2017.07.16 1489
공지 장애 복구 안내 [9] 관리자 2017.05.04 1876
공지 TeX Live 2016 설치 안내 [7] 관리자 2016.06.05 21903
700 MathJax를 이용하여 웹에서 수식을 써 봅시다 [22] file 샘처럼 2010.12.29 123516
» 조건부 텍스트 [6] file yihoze 2018.08.21 317
698 워드, 인디자인, 그리고 레이텍 [1] yihoze 2018.08.28 222
697 호와 원 [1] file yihoze 2018.07.31 386
696 jupyter 의 smalltalk 버전이 있네요. 불량양파 2018.07.28 258
695 설문: 레이텍 과정 [31] yihoze 2018.07.04 884
694 ksbaduk 패키지 이야기(1): 흰돌과 검은돌 [8] file nanim 2015.06.06 498
693 TeX Live 2018 [5] 지나가다 2018.04.28 1718
692 latex 에디터 Gummi 소개입니다. [9] file guest 2011.05.01 43603
691 memoir(oblivoir) + tikzpagenodes 호환을 위한 삽질기 [7] file Kriss 2018.04.10 1102
690 [TL2014] [win32] 한글 파일 이름 문제 해결(?) [12] DohyunKim 2014.07.09 6334
689 KTUG 사설 TL 저장소 소식​ [26] DohyunKim 2014.04.26 6682
688 윈도우에서 LyX 2.0 설치시 오류 날 경우 [1] file min-j 2013.09.08 19892
687 ‘나눔옛한글’과 ‘나눔바른펜’ 공개 [4] 에드 2014.10.03 4578
686 TeX Live 2018 출시 일정이 나왔네요. Dennis 2018.03.10 988
685 lilypond와 LaTeX [2] file cantabile 2018.03.05 674
684 [참가신청] 문서작성 워크숍 2017 [3] ischo 2017.10.17 1366
683 한국 TeX 사용자 페북 그룹 [2] yihoze 2017.11.21 896
682 11월 15일에 후원해주신 분 [2] yihoze 2017.11.20 409



XE Login