2.7 맞춤 블록

knitrblock 엔진, 즉 청크 옵션 engine = 'block' 또는 보다 간결한 구문 ```{block} 을 사용하여 맞춤형 블록(custom block)을 생성할 수 있습니다. 이 엔진은 문자열을 받는 청크 옵션 type과 함께 사용해야 합니다. block 엔진을 사용하면 출력 형식이 HTML인 경우 청크 콘텐츠를 래핑하는 <div>를 생성하고 출력이 LaTeX 인 경우 LaTeX 환경을 생성합니다. type 옵션은 <div>의 클래스와 LaTeX 환경의 이름을 지정합니다. 예를 들어, 다음과 같은 청크의 R Markdown 소스가 있다고 할 떄,

​```{block, type='FOO'}
Some text for this block.
​```

다음과 같이 출력할 수 있습니다.

Some text for this block.

HTML의 출력형태는 다음과 같습니다.

<div class="FOO">
Some text for this block.
</div>

그리고 LaTeX의 출력은 다음과 같습니다:

\begin{FOO}
Some text for this block.
\end{FOO}

블록의 스타일을 정의하는 방법은 책 저자에게 달려 있습니다. CSS에서 <div>의 스타일을 정의하고 YAML 메타 데이터의 includes 옵션을 통해 출력에 포함할 수 있습니다. 마찬가지로 \newenvironment를 통해 LaTeX 환경을 정의하고 includes 옵션을 통해 LaTeX 출력에 정의를 포함할 수 있습니다. 예를 들어, CSS 파일 즉 style.css 파일에 다음의 스타일을 저장할 수 있습니다.

div.FOO {
  font-style: italic;
  color: red;
}

같은 방법으로

b.BAR {
  font-style: normal;
  font-weight: bold;
  color: blue;
}

style.css 파일에 정의합니니다.

R Markdown 문서의 HTML 문서 작성을 위한 YAML 메타 데이터는 다음과 같습니다.

---
output:
  bookdown::html_book:
    includes:
      in_header: style.css
---

그러면 위의 <div><b>를 다음과 같이 R Markdown에 문서에 사용할 수 있습니다.

<div class="FOO">Some <b class="BAR">text</b> for this block.</div>

출력 결과는 다음과 같습니다.

Some text for this block.

한편, 공지(note), 팁(tip), 중요사항(important), 주의(caution) 그리고 경고(warning) 등을 표시하기 위한 몇 가지 유형의 블록을 정의할 수 있습니다. 다음은 몇 가지 예입니다.

이를 위해서는 style.css 파을을 다음과 같이 생성합니다.

.blackbox {
  padding: 1em;
  background: black;
  color: white;
  border: 2px solid orange;
  border-radius: 10px;
}
.center {
  text-align: center;
}

.infobox {
  padding: 1em 1em 1em 4em;
  margin-bottom: 10px;
  border: 2px solid orange;
  border-radius: 10px;
  background: #f5f5f5 5px center/3em no-repeat;
}

.caution {
  background-image: url("images/caution.png");
}


.warning {
  background-image: url("images/warning.png");
}


.note {
  background-image: url("images/note.png");
}

.tip {
  background-image: url("images/tip.png");
}

.important {
  background-image: url("images/warning.png");
}

그리고 gitbook 작성을 위한 YAML 메타 데이터는 다음과 같이 수정해 줍니다. R Markdown 문서의 gitbook 작성을 위한 YAML 메타 데이터는 다음과 같습니다.

---
output:
  bookdown::gitbook:
  css: style.css
---

경고 박스 부분에 대한 R Markdown 소스는 다음과 같습니다.

::: {.infobox .warning data-latex="{warning}"}
**WARNING!**

Thank you for noticing this **new warningn**! 

Your noticing it has been noted, and _will be reported to the authorities_!
:::

나머지 공지(note), 팁(tip), 중요사항(important) 그리고 주의(caution) 등은 ::: {.infobox .warningwarningnote, tip, notice, 그리고 caution 등으로 수정해서 복사해 주면 됩니다.

WARNING!

Thank you for noticing this new warning!

경고 사항을 꼭 주지 하시기 바랍니다.

CAUTION!

Thank you for noticing this new caution!

향후 이 부분을 주의하시기 바랍니다.

NOTE!

Thank you for noticing this new note!

향후 이 부분은 꼭 참고하시기 바랍니다.

TIP!

Thank you for noticing this new tip!

향후 이 을 알고 계시면 도움이 될 것입니다.

IMPORTANT!

Thank you for noticing this new important!

이 부분은 매우 중요한 사항입니다.

한편 위의 style.css 파일에는 blackbox에 대한 정의가 되어 있다. 이에 대한 R Markdown 소스를 다음과 같이 삽입해 보자.

:::: {.blackbox data-latex=""}
::: {.center data-latex=""}
**NOTICE!**
:::

Thank you for noticing this **new notice**! 

**공지 사항**을 꼭 주지 하시기 바랍니다.
::::

그러면 다음과 같은 검은 상자 안에 글의 내용이 표시가 된다.

NOTICE!

Thank you for noticing this new notice!

공지 사항을 꼭 주지 하시기 바랍니다.

knitr block 엔진은 간단한 콘텐츠(일반적으로 일반 텍스트 단락)를 표시하도록 설계되었습니다. 특정 단어를 굵게 또는 기울임 꼴로 만드는 것과 같은 간단한 형식 지정 구문을 사용할 수 있지만 인용 및 상호 참조와 같은 고급 구문은 작동하지 않습니다. 그러나 임의의 Markdown 구문을 지원하는 block2라는 대체 엔진이 있습니다. 예를 들어,

​```{block2, type='FOO'}
Some text for this block [@citation-key].

- a list item
- another item

More text.
​```

위의 내용은 다음과 같이 출력됩니다.

Some text for this block (citation-key?).

  • a list item
  • another item

More text.

문서에 커스텀 블록이 많으면 block2엔진이 block 엔진보다 빠르지만 구현은 hack을 기반으로 합니다. 그래서 우리는 그것이 항상 미래에 작동할 것인지 100% 확신하지 못합니다. 그렇지만 Pandoc v1.17.2에서 아직까지 문제가 발생하지는 않았습니다.

block2 엔진에 대한 한 가지 더 주의해야 사항은 블록의 마지막 요소가 일반 단락이 아닌 경우 끝에 빈 줄을 남겨야 합니다.

​```{block2, type='FOO'}
Some text for this block [@citation-key].

- a list item
- another item
- end the list with a blank line

​```

섹션 2.2.2의 정리 및 증명 환경은 실제로 block2 엔진을 통해 구현된 것입니다.

block 또는 block2 엔진을 기반으로 하는 모든 사용자 정의 블록에는 블록을 표시(echo = TRUE) 하거나 숨기는 데 사용할 수 있는 (echo = FALSE) 하나의 청크 옵션 echo가 있습니다.