2.7 맞춤 블록
knitr의 block
엔진, 즉 청크 옵션 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>
출력 결과는 다음과 같습니다.
한편, 공지(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 .warning
중 warning
을 note
, 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.
```
위의 내용은 다음과 같이 출력됩니다.
문서에 커스텀 블록이 많으면 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
가 있습니다.