본문 바로가기
Topos Uranos

요약

이 강의는 표와 그림을 다루는 이 강좌의 다섯째 단원을 마무리한다. 가장 단순한 표에서 플로트에 넣은 TikZ 그림에 이르는 원리와 장치의 사슬을 다시 세우고, 각 고리에서 어떤 원리가 쓰이며 그것이 어느 강의에서 확립되는지를 짚는다. 성취한 것을 강좌의 계획 속에 자리매김하고, 여기서는 예고만 한 채 다음 단원들로 넘기는 문제가 무엇인지 밝힌다. 마무리 평가에서는 시작 평가의 기능을 되풀이한다. 끝으로 여섯 개의 도전 과제를 둔다. 강의의 문제보다 어렵고 여러 강의를 결합해야 하는 과제로, 학부 규정에 따라 실험 보고서의 표를 조판하기, 경고 없이 컴파일되면서 결함 여섯 개를 보이는 문서를 진단하기, 사진 한 장과 직접 그린 모식도로 그림 하나를 짜기, 데이터 파일에서 표를 만들기, 두 단으로 옮기면 무너지는 그림을 다시 만들기, 그리고 서로 다른 세 표의 환경을 고르기이다.

학습 목표

  1. 단원의 장치들이 놓이는 순서를 다시 세우고, 각 장치가 기대는 원리를 밝힌다.
  2. 표, 이미지, 플로트의 그토록 많은 결함이 왜 경고 없이 컴파일되는지, 그리고 그 흔적을 결과물의 어디에서 찾아야 하는지 설명한다.
  3. 단원이 확립한 것과, 예고만 했고 다음 단원들이 펼칠 것을 구별한다.
  4. 정렬된 수, 캡션, 이름, 참조, 하위 그림, 그림을 결합한 표와 그림을 조판하고, 그것들을 결합한 소스가 무엇을 만들어 낼지 예측한다.
  5. 표, 이미지, 그림마다 문서의 변경을 견디는 환경, 크기, 자리를 고른다.

단원에서 이룬 것

이 단원의 목표는 논문의 데이터, 이미지, 그림이 본문만큼 분명하게 읽히고, 절이나 수식처럼 번호가 붙고 참조되며, 저자가 손으로 정하지 않아도 쪽 위에서 제자리를 찾게 하는 것이었다. 이 목표는 도입이 앞 단원들에서 이미 안다고 본 것에 기대어 이루어졌다. 곧 레이블이 무엇을 기록하느냐에 달린 참조, 각 \\가 줄을 열고 각 &가 칸을 나누는 앞 단원의 정렬, 그리고 결정을 한 번만 내리는 곳인, 자기 명령을 갖춘 프리앰블이다. 그러므로 지나온 길은 다섯 구간으로 이루어진 하나의 사슬로 읽을 수 있다.

읽기 쉬운 표

읽기 쉬운 표를 다룬 강의는 정렬의 원리를 본문에 가져왔다. tabular는 \\마다 줄을 하나, & 두 개 사이마다 칸을 하나 만들고, 칸마다 열 지정 문자가 하나씩 대응하며, 전체는 엔진이 통째로 놓는 상자이다. 세는 규칙에서 두 가지 오류를 끌어냈다. \\가 빠지면 다음 줄에서 보고되는 “시끄러운” 오류 “Extra alignment tab”과, 칸이 모자란 줄이라는 “조용한” 오류로, 엔진은 뒤의 것을 받아들인다. 격자를 booktabs의 가로선 세 개로 바꾸고, 잘라 낸 \cmidrule과 \addlinespace를 썼다. siunitx의 S 열로 수를 소수점에 맞추었다. 그 table-format은 자리를 확보하는데, 그보다 넓은 수는 그 자리를 넘어가면서 로그에 “Overfull \hbox” 하나 말고는 아무 흔적도 남기지 않는다. 또 S 열은 기본적으로 소수점으로 마침표를 출력하며, 이는 한국어의 관행과 같다(소수점 기호는 babel이 아니라 \sisetup이 정한다). 단위는 머리말로 옮겨 S 열에서는 중괄호로 감쌌다. 그리고 \raggedright\arraybackslash로 오른쪽 끝을 맞추지 않는 글을 조판했다.

복잡한 표와 긴 표

복잡한 표와 긴 표를 다룬 강의는 세는 규칙을, 여러 칸의 자리를 차지하는 \multicolumn으로 넓히고, 맨 앞의 &를 잊으면 묶음 머리말이 밀려나도 엔진이 알아차리지 못함을 보였다. 부분 가로선은 자기 열 번호만 따르기 때문이다. tabularx로, 또는 tabular*와 \extracolsep{\fill}로 표에 줄 너비를 주었고, 글자 크기를 바꾸는 \resizebox는 물리쳤다. longtable로 긴 표를 여러 쪽에 나누었다. longtable은 머리말을 되풀이하고, 이어지는 부분에 \caption[]을 두면 번호를 한 번만 매기며, 열 너비를 정하려고 한 번 더 컴파일을 요구하고, table에 넣으면 줄을 잃는다. 그리고 유일한 출처인 데이터 파일에서 csvsimple과 pgfplotstable로 표를 만들면서, overwrite 없는 filecontents*는 파일을 다시 쓰지 않는다는 점을 일러두었다.

문서 안의 그림

문서 안의 그림을 다룬 강의는 \includegraphics가 상자를 만들고, 엔진이 그것을 커다란 글자처럼 줄 안에 놓는다는 것을 확립했다. 그리고 여기서 이미지를 줄 너비 밖으로 밀어내는 문단 들여쓰기, 이미지를 가운데에 놓는 방법, 두 이미지를 나란히 놓는 방법을 끌어냈다. 크기는 놓인 자리에 맞추어 달라지는 \linewidth를 기준으로 나타냈다. keepaspectratio 없이 너비와 높이를 함께 주면 경고 없이 일그러지고, 옵션은 쓴 순서대로 적용됨을 보였다. PDF로 내보내는 벡터 그래프와, 엔진이 해상도를 확인하지 않는 사진을 구별했다. 그리고 파일 찾기를 공부했다. 확장자를 빼면 PDF가 PNG보다 경고 없이 먼저 선택되고, \graphicspath에는 이중 중괄호가 필요하다.

그림과 표의 플로트

그림과 표의 플로트를 다룬 강의는 나눌 수 없는 상자에서 플로트를 끌어냈다. 나뉘지 않고 들어가지도 않는 것은 들어갈 수 있는 곳으로 옮겨지며, 그래서 번호로 참조한다. 배치 지정자를 허용된 자리로 설명하고, [h]가 [ht]로 넓어지는 것, [H]가 만드는 빈자리, 놓일 곳이 없어 다른 그림들을 붙잡는 그림을 보였다. 캡션을 조판했다. 캡션은 번호를 매기고 목록에 올리며, 표에서는 caption 패키지의 간격과 함께 위에 놓인다. kotex가 정한 목록 제목 “표 차례”를 “표 목차”로 바꾸었는데, kotex는 불러오는 순간에 이름을 정하므로 \renewcommand는 kotex 다음에 써야 하고, 앞에 쓰면 덮어쓰인다. cleveref는 \crefname으로 고쳤다. caption이 캡션 앞에 놓인 레이블을 드러낸다는 것을 확인했다. 그리고 하위 그림, 한 figure 안의 독립된 그림들, threeparttable로 붙이는 표의 주석을 조판했다. 그에 앞서 플로트 안의 \footnote가 내용을 잃는다는 것을 보였다.

TikZ로 그리기

TikZ로 그리기를 다룬 강의는 끼워 넣는 이미지에서 써서 만드는 이미지로 옮겨 갔다. 먼저 프리앰블에서 시작했다. kotex는 TikZ가 쓰는 기호를 건드리지 않지만, 여러 언어의 babel 모듈이 기호를 활성화한다(스페인어 모듈은 >를 활성화하며, \usetikzlibrary{babel}이 없으면 첫 화살표에서 오류가 연쇄된다). 그래서 babel 라이브러리는 습관처럼 불러온다. 직교 좌표, 극좌표, 상대 좌표를 +와 ++의 차이와 함께 살폈다. 경로, 선의 옵션, arrows.meta의 화살촉, 이름과 앵커를 지니고 positioning으로 서로의 자리를 정하는 노드, \tikzset의 스타일과 \foreach의 반복, 여러 분야의 도식, 사인이 경고 없이 도 단위로 재어지는 함수 그래프, 그리고 pgfplots를 다루었다. 끝으로 그림을 플로트에 넣고, 그림을 줄이는 세 가지 방법을 비교했다.

다음 그림은 다섯 구간을 하나의 사슬로 모은다. 가운데 열의 각 노드는 장치나 규칙이며, 서로 기대는 순서대로 번호가 붙고, 자기가 쓰는 앞의 고리들과 호로 이어져 있다. 그 둘레에는 받침들이 떠 있다. 사슬이 거듭 의지하는 원리들로, 각 받침은 자기에게 기대는 고리들과는 실선으로, 자기가 확립되는 고리와는 점선으로 이어진다. 앞 단원들에서 확립된 받침은 고리 모양으로 그려진다. 받침을 누르면 그것을 쓰는 고리가 모두 강조되고, 각 고리는 그것을 공부하는 강의로 이어진다.

사슬의 받침

  • A레이블이 기록하는 것. 레이블은 자기 앞에서, 자기 환경 안에서 마지막으로 매겨진 번호를 기록한다. 자기가 무엇에 붙어 있는지는 모른다. 셋째 단원에서 확립. 이 단원에서는 증명 없이 받아들인다.
  • B정렬은 표다. 정렬 환경은 \\마다 줄을 하나, & 두 개 사이의 구간마다 칸을 하나 만든다. 줄이 다 차지 않아도 그렇다. 앞 단원에서 확립. 이 단원에서는 증명 없이 받아들인다.
  • C한 번만 정하기. 한곳에서 정한 것(프리앰블의 명령이나 서식, 스타일, 데이터 파일)은 거기서 바꾸면 문서 전체에서 바뀐다. 손으로 옮겨 적은 것은 어긋나게 된다. 앞 단원들에서 확립. 이 단원에서는 증명 없이 받아들인다.
  • D컴파일 횟수. 엔진은 한 번의 컴파일에서 계산한 것을 보조 파일에 적고 다음 컴파일에서 그것을 쓴다. 첫째 단원에서 확립. 이 단원에서는 증명 없이 받아들인다.
  • Ekotex가 하는 일. hangul 옵션을 준 kotex는 “그림”, “표”, “표 차례” 같은 이름을 정하는데, 불러오는 순간에 정한다. 그래서 이름을 바꾸는 \renewcommand는 kotex 다음에 써야 통하고, 앞에 쓰면 덮어쓰인다(babel은 반대로 문서가 시작될 때 이름을 다시 정한다). kotex는 수의 소수점을 쉼표로 바꾸지 않고 기호도 활성화하지 않는다. 그렇게 하는 babel 모듈도 있다(스페인어는 <와 >). 일부는 앞 단원에서 확립. 이 단원에서는 증명 없이 받아들인다.
  • F상자는 나뉘지 않는다. 표, 이미지, 그림은 엔진이 커다란 글자처럼 통째로 놓는 상자이며, 두 쪽에 걸쳐 잘리지 않는다. 확립되는 곳: 1. 줄과 칸.
  • G올바른 것은 경고되지 않는다. 엔진은 조판할 수 없는 것에 대해서만 경고한다. 올바른 소스가 저자의 뜻과 다른 것을 말하면 경고 없이 컴파일되고, 결함은 결과물에서만 보인다. 확립되는 곳: 1. 줄과 칸.
  • H플로트와 참조. 나뉘지 않고 쓴 자리에 들어가지도 않는 것은 들어갈 수 있는 곳으로 옮겨진다. 그래서 플로트는 번호로 참조하고, 결코 자리로 참조하지 않는다. 확립되는 곳: 13. 왜 플로트하는가.
  1. 제1구간 읽기 쉬운 표

    • 데이터를 찾아보는 방식에 따라 표, 목록, 그림 가운데서 고른다.
    • tabular와 booktabs의 가로선으로 격자 없는 표를 조판한다.
    • S 열로 수를 소수점에 맞춘다.
    • 표의 오류를, 경고가 나지 않는 것까지 진단한다.
    1. 줄과 칸. tabular는 정렬의 규칙을 본문으로 가져온다. 열마다 문자 하나, 칸 사이에 &, 줄 끝에 \\. 칸이 넘치는 줄은 “Extra alignment tab”을 내며, \\가 빠졌으면 다음 줄에서 보고된다. 칸이 모자란 줄은 올바르고, 전체는 나뉘지 않는 상자이다.

      받침: B (정렬은 표다), F (상자는 나뉘지 않는다), G (올바른 것은 경고되지 않는다). 증명된 수업: 읽기 쉬운 표.

    2. 격자 대신 가로선. 세로선도 이중선도 쓰지 않는다. \toprule, \midrule, \bottomrule, 잘라 낸 \cmidrule, \addlinespace. 여기에 \hline을 섞어도 경고는 나지 않고 두 계통의 선이 남는다.

      사용: 1. 줄과 칸. 받침: G (올바른 것은 경고되지 않는다). 증명된 수업: 읽기 쉬운 표.

    3. 소수점에 맞춘 수. S 열은 구분 기호에 맞추어 정렬한다. table-format은 자리를 확보하고, 더 넓은 수는 삐져나오면서 이름 없는 “Overfull \hbox” 하나만 남긴다. siunitx는 기본적으로 마침표를 출력하며 소수점 기호를 babel에서 받지 않고 \sisetup으로 정한다. 천 단위를 나누는 쉼표는 소수점으로 읽힌다.

      사용: 1. 줄과 칸. 받침: E (kotex가 하는 일), G (올바른 것은 경고되지 않는다), C (한 번만 정하기). 증명된 수업: 읽기 쉬운 표.

    4. 머리말과 글. 단위는 머리말에 한 번 쓰고, S 열의 머리말은 중괄호로 감싼다. \makecell은 긴 머리말을 줄바꿈한다. 오른쪽 끝을 맞추지 않는 문단 열에는 \raggedright\arraybackslash를 붙이며, \arraybackslash가 없으면 “Misplaced \noalign”이 나온다.

      사용: 3. 소수점에 맞춘 수, 2. 격자 대신 가로선. 받침: B (정렬은 표다). 증명된 수업: 읽기 쉬운 표.

  2. 제2구간 복잡한 표와 긴 표

    • 열을 묶고 각 줄의 칸을 센다.
    • 확대·축소 없이 표에 줄 너비를 준다.
    • 긴 표를 여러 쪽에 나눈다.
    • 데이터 파일에서 표를 만든다.
    1. 여러 열에 걸친 칸. \multicolumn은 여러 칸의 자리를 차지하며, 줄의 칸 수는 열 지정을 넘으면 안 된다. 맨 앞의 &를 잊으면 묶음이 경고 없이 밀린다. \cmidrule은 자기 열 번호만 따르기 때문이다. 남는 너비는 묶음의 마지막 열로 간다.

      사용: 1. 줄과 칸, 2. 격자 대신 가로선. 받침: B (정렬은 표다), G (올바른 것은 경고되지 않는다). 증명된 수업: 복잡한 표와 긴 표.

    2. 줄의 너비. tabularx는 X 열이나 \newcolumntype으로 선언한 L 열을 넓힌다. tabular*는 \extracolsep{\fill}로 열 사이에 여백을 나눈다. \resizebox는 물리친다. 표마다 글자 크기가 달라지기 때문이다.

      사용: 4. 머리말과 글. 받침: F (상자는 나뉘지 않는다), C (한 번만 정하기). 증명된 수업: 복잡한 표와 긴 표.

    3. 여러 쪽에 걸친 표. longtable은 나뉠 수 있고 \endfirsthead와 \endhead로 머리말을 되풀이한다. \caption으로 번호를 매기고 \caption[]으로 잇는다. 열 너비를 기록하고 한 번 더 컴파일을 요구한다. table 안에서는 다시 상자가 되어 줄을 잃는다.

      사용: 5. 여러 열에 걸친 칸. 받침: F (상자는 나뉘지 않는다), D (컴파일 횟수). 증명된 수업: 복잡한 표와 긴 표.

    4. 데이터에서 만드는 표. 데이터의 출처는 파일 하나뿐이다. csvsimple은 그 글자를 옮기고, pgfplotstable은 그 수를 다듬는다. overwrite 없는 filecontents*는 이미 있는 파일을 다시 쓰지 않고 그 사실을 알리기만 한다.

      사용: 3. 소수점에 맞춘 수, 7. 여러 쪽에 걸친 표. 받침: C (한 번만 정하기), G (올바른 것은 경고되지 않는다). 증명된 수업: 복잡한 표와 긴 표.

  3. 제3구간 문서 안의 그림

    • 줄을 기준으로 이미지 크기를 정하고 그 치수를 예측한다.
    • 이미지마다 형식을 고르고 해상도를 확인한다.
    • 이미지 파일에 이름을 붙이고, 자리를 정하고, 찾아낸다.
    • 이미지를 글자처럼 줄 안에 놓는다.
    1. 이미지는 커다란 글자. \includegraphics는 기준선 위에 선 상자를 만든다. 문단 들여쓰기 뒤에서 width=\linewidth인 이미지는 삐져나온다. 가운데에 놓으려면 줄을 가운데 정렬하고, 두 이미지는 줄에 들어가면 나란히 놓인다.

      받침: F (상자는 나뉘지 않는다). 증명된 수업: 문서 안의 그림.

    2. 크기와 옵션의 순서. \linewidth를 기준으로 한 크기는 자리에 맞추어 달라진다. keepaspectratio 없이 너비와 높이를 주면 경고 없이 일그러진다. 옵션은 쓴 순서대로 적용된다. trim에는 clip이 필요하고, 없는 쪽은 컴파일을 멈춘다.

      사용: 9. 이미지는 커다란 글자. 받침: G (올바른 것은 경고되지 않는다). 증명된 수업: 문서 안의 그림.

    3. 형식과 해상도. 그래프는 벡터이며 쓰는 크기로 PDF로 내보낸다. 사진은 비트맵이며 인치당 약 300픽셀이 필요하지만 엔진은 이를 확인하지 않는다. SVG는 미리 변환하고, EPS는 graphicx가 변환한다.

      사용: 10. 크기와 옵션의 순서. 받침: G (올바른 것은 경고되지 않는다). 증명된 수업: 문서 안의 그림.

    4. 이름과 경로. 확장자를 빼면 엔진은 정해진 순서대로 시도하고, 경고 없이 PNG보다 PDF를 먼저 쓴다. \graphicspath에는 이중 중괄호가 필요하며, 홑 중괄호면 글자 하나하나가 폴더가 된다. 초안 모드는 어떤 파일이 쓰였는지 보여 준다.

      사용: 11. 형식과 해상도. 받침: G (올바른 것은 경고되지 않는다). 증명된 수업: 문서 안의 그림.

  4. 제4구간 그림과 표의 플로트

    • 그림이 왜 플로트하는지 설명하고 번호로 참조한다.
    • 플로트의 자리를 이끌고 제한한다.
    • 플로트마다 캡션, 이름, 레이블을 준다.
    • 하위 그림과 표 안의 주석을 조판한다.
    1. 왜 플로트하는가. figure와 table은 상자를 들어갈 수 있는 곳으로 옮기고, 참조는 번호로 한다. 문자는 허용된 자리이며, [h]는 [ht]까지만 넓어지고, [H]는 빈자리를 남기며, 놓일 곳이 없는 그림은 같은 종류의 다른 플로트를 붙잡는다.

      사용: 1. 줄과 칸, 9. 이미지는 커다란 글자. 받침: F (상자는 나뉘지 않는다), H (플로트와 참조). 증명된 수업: 그림과 표의 플로트.

    2. 캡션. \caption은 번호를 매기고, 조판하고, 목록에 올린다. 목록에는 한 번 더 컴파일이 필요하고, 짧은 제목을 줄 수도 있다. 표에서는 위, 그림에서는 아래에 놓으며, caption 패키지가 문서 전체의 간격과 서식을 정한다.

      사용: 13. 왜 플로트하는가. 받침: D (컴파일 횟수), C (한 번만 정하기). 증명된 수업: 그림과 표의 플로트.

    3. 이름과 참조. \renewcommand{\listtablename}{표 목차}는 kotex 다음에 쓰면 목록 제목을 바꾸고, kotex 앞에 쓰면 kotex가 경고 없이 덮어쓴다. 한국어 옵션이 없는 cleveref에는 \crefname{table}{표}{표}가 필요하다. 레이블은 캡션 뒤에 두며, caption이 있으면 잘못 놓인 레이블은 경고 하나와 물음표 두 개를 낳는다.

      사용: 14. 캡션. 받침: A (레이블이 기록하는 것), E (kotex가 하는 일). 증명된 수업: 그림과 표의 플로트.

    4. 하위 그림과 주석. subcaption은 그림의 부분에 글자를 붙이고, cleveref는 그것을 “그림 1b”라고 부른다. 독립된 그림들은 한 figure 안의 minipage에 넣으며, 절대 거꾸로 하지 않는다. 플로트 안의 \footnote는 경고 없이 내용을 잃고, threeparttable이 주석을 표에 묶는다.

      사용: 15. 이름과 참조, 9. 이미지는 커다란 글자. 받침: H (플로트와 참조), G (올바른 것은 경고되지 않는다). 증명된 수업: 그림과 표의 플로트.

  5. 제5구간 TikZ로 그리기

    • 그림을 그리기 위해 문서의 프리앰블을 준비한다.
    • 절대 좌표, 극좌표, 상대 좌표로 점을 놓는다.
    • 이름 붙은 노드와 자기 스타일로 도식을 짠다.
    • 그림을 플로트에 넣고, 본문 글자 크기를 잃지 않고 줄인다.
    1. babel 라이브러리. 한국어 문서에서는 화살표가 이 라이브러리 없이도 작동하지만, 기호를 활성화하는 모듈은 화살표를 망가뜨린다. 스페인어에서는 불러오는 순서와 상관없이 첫 화살표가 오류의 연쇄를 낳는다. \usetikzlibrary{babel}이 이를 바로잡으므로 습관처럼 불러온다. arrows.meta나 positioning이 없으면 메시지는 “Unknown arrow tip kind”와 “Unknown function of”이다.

      받침: E (kotex가 하는 일). 증명된 수업: TikZ로 그리기.

    2. 좌표와 경로. 좌표에는 직교 좌표, 극좌표, 상대 좌표가 있다. ++는 기준점을 옮기고 +는 옮기지 않는다. 빠뜨린 세미콜론은 다음 줄에서 보고되고, sin(\x)는 경고 없이 각을 도 단위로 잰다.

      사용: 17. babel 라이브러리. 받침: G (올바른 것은 경고되지 않는다). 증명된 수업: TikZ로 그리기.

    3. 노드와 스타일. 노드는 이름과 앵커를 지닌 상자이다. positioning은 테두리 사이의 거리로 다른 노드에 대한 자리를 정하므로 도식이 저절로 다시 배치된다. \tikzset은 스타일을 정하고 \foreach는 되풀이한다.

      사용: 18. 좌표와 경로. 받침: F (상자는 나뉘지 않는다), C (한 번만 정하기). 증명된 수업: TikZ로 그리기.

    4. 플로트 안의 그림. 그림은 상자이며 캡션, 레이블과 함께 figure에 들어간다. scale은 글자 크기를 지키고, transform shape은 글자를 줄이며, \resizebox는 모든 것을 줄인다. compat을 준 pgfplots는 소수점으로 마침표를 출력하고, kotex도 babel도 그 수를 바꾸지 않는다.

      사용: 19. 노드와 스타일, 15. 이름과 참조, 6. 줄의 너비. 받침: H (플로트와 참조), E (kotex가 하는 일). 증명된 수업: TikZ로 그리기.

참고문헌으로. 사슬은 표, 이미지, 그림이 조판되고 번호가 붙고 참조된 곳에서 멈춘다. 데이터와 남의 이미지의 출처는 여기서는 출처 줄에 손으로 적었지만, 다음 단원에서는 참고문헌 데이터베이스에서 분야마다의 양식으로 인용하게 된다.