R Markdownで生成するhtmlタグ要素のidとclassを確認

諸事情により必要になったので，この際調べることにした。

## 留意事項

できるだけプレーンなものをチェックしたかったので，基本的なものだけをやっています。なおidやclassはR Markdown上で色々やれば付与させることができますし，Rチャンクの内容によってはその出力のタグが変化することもあります。今回はそのあたりを省いています。

あと，生成されたhtmlは左寄せになってますが，今回は読みやすいように一部で私がインデントつけてます。また，使用したRmdファイルの内容は文末に記しています。

## 元のRmdと生成されたhtml

### heading

見出し要素。h1からh6までを検証:

#### Rmdコード

```md
# 見出し1

## 見出し2

### 見出し3

#### 見出し4

##### 見出し5

###### 見出し6
```

#### html

```html
<div id="1" class="section level1">
  <h1>見出し1</h1>
  <div id="2" class="section level2">
    <h2>見出し2</h2>
    <div id="3" class="section level3">
      <h3>見出し3</h3>
      <div id="4" class="section level4">
        <h4>見出し4</h4>
        <div id="5" class="section level5">
          <h5>見出し5</h5>
          <div id="6" class="section level6">
            <h6>見出し6</h6>
            (中略)
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
```

見出し要素自体はそのまま`h`要素となっていますが，`div`要素で覆われるようになり，また自動的にネストされます。この`div`要素に`id`と`class`が付与されます。`id`はその見出しの文字列が入りますが，半角英数字以外は取り除いてきます。このあたりはR Markdownのデフォルト仕様とPandoc拡張が関係しています。気になる方は[このあたり](http://qiita.com/kazutan/items/eb15a42607f87f57b525#5%E8%A1%8C%E7%9B%AE-%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F%E3%81%AE%E6%8C%87%E5%AE%9A)を参照してください。

また，classとして`section`と見出しレベルの応じたものが付与されています。このあたりのを活用してRmdのスライドとかタブ機能を実装してたりします。

### 段落・イタリック・ボールド

#### Rmdコード

```md
イタリックのテストします。*ひとつめ*。_ふたつめ_。

ボールドのテストします。**ひとつめ**。__ふたつめ__。
```
#### html

```html
<p>イタリックのテストします。<em>ひとつめ</em>。<em>ふたつめ</em>。</p>
<p>ボールドのテストします。<strong>ひとつめ</strong>。<strong>ふたつめ</strong>。</p>
```

そのままですね。

### 番号なしリスト

いわゆる`ul>li`のリストです。

#### Rmdコード

```md
- 番号なしリスト1
    - 番号なしリスト1-1
    - 番号なしリスト1-2
- 番号なしリスト2
- 番号なしリスト3
    - 番号なしリスト3-1
```

#### html

```html
<ul>
  <li>番号なしリスト1
    <ul>
      <li>番号なしリスト1-1</li>
      <li>番号なしリスト1-2</li>
    </ul></li>
  <li>番号なしリスト2</li>
  <li>番号なしリスト3
    <ul>
      <li>番号なしリスト3-1</li>
    </ul></li>
</ul>
```

特になし。

### 番号リスト

#### Rmdのコード

```md
1. 番号リスト1
    1. 番号リスト下1-1
    2. 番号リスト下1-2
2. 番号リスト2
3. 番号リスト3
    1. 番号リスト下3-1
```

#### html

```html
<ol style="list-style-type: decimal">
  <li>番号リスト1
    <ol style="list-style-type: decimal">
      <li>番号リスト下1-1</li>
      <li>番号リスト下1-2</li>
    </ol></li>
  <li>番号リスト2</li>
  <li>番号リスト3
    <ol style="list-style-type: decimal">
      <li>番号リスト下3-1</li>
    </ol></li>
</ol>
```

自動的に`list-style-type: decimal`がol要素に付与されています。これは番号をアラビア数字(1,2,3..)で指定しているためかと思われます。

### 定義リスト

RStudioのHelpにある"Markdown Quick Reference"には記述されていませんが，R Markdownでも定義リストが使えます。詳しくは[こちらの記事](http://qiita.com/kazutan/items/1b7aef65abbe188bf86f)を参照してください。

#### Rmdのコード

```md
定義リスト1

: 定義リスト1の中身

定義リスト2

: 定義リスト2の中身
```

#### html

```html
<dl>
  <dt>定義リスト1</dt>
  <dd><p>定義リスト1の中身</p>
  </dd>
  <dt>定義リスト2</dt>
  <dd><p>定義リスト2の中身</p>
  </dd>
</dl>
```

dl要素で覆われます。ただ，dd要素の中身が自動的にp要素になっていますね。知らなかった。

### リンク要素

一応確認。

#### Rmdコード

```md
[リンク文字](https://kazutan.github.io/kazutanR/)

https://kazutan.github.io/kazutanR/
```

#### html

```html
<p><a href="https://kazutan.github.io/kazutanR/">リンク文字</a></p>
<p><a href="https://kazutan.github.io/kazutanR/" class="uri">https://kazutan.github.io/kazutanR/</a></p>
```

p要素にくくられていますね。

### 画像

試してみます。

#### Rmdコード

```md
![](pics/user.png)
```

#### html

```html
<div class="figure">
<img src="pics/user.png" />

</div>
```

img要素にリンクが差し込まれていますが，そのタグをdiv要素で覆っています。またclassに`figure`が付与されています。今回画像埋め込みを単独要素となるように記述したために，こういう処理がされたのかも。このあたりちょっと気をつけといたほうがいいかも。

### 引用

やってみます。

#### Rmdコード

```md
引用のテスト

> Why are you using SJIS?
```

#### html

```html
<p>引用のテスト</p>
<blockquote>
<p>Why are you using SJIS?</p>
</blockquote>
```

blockquote要素内に，p要素が入ってきています。今回引用が1行ということもあって，こういう感じになっているのだと思います。

### コードブロック

通常のMarkdownのコードブロックをテストします。ついでにインラインコードもテストします。

#### Rmdコード

    ```
    > 1 + 1
    ``` 
    
    インライン用に`1+1`してみる。

#### html

```html
<pre><code>&gt; 1 + 1</code></pre>
<p>インライン用に<code>1+1</code>してみる。</p>
```

コードブロックの場合はpre>codeとなっています。インラインの場合は単にcode要素で差し込まれていますね。

### 数式

コードブロックと同様にインライン要素についてもあわせてテストします。

#### Rmdコード

```md
$$
y = x_1 + x_2
$$

インライン数式用に$\mu = 3.44$してみる。
```

#### html

```html
<p><span class="math display">\[
y = x_1 + x_2
\]</span></p>
<p>インライン数式用に<span class="math inline">\(\mu = 3.44\)</span>してみる。</p>
```

色々入ってきています。これはコードハイライトを当てるために加工されていると思われます。ただ，基本はp要素のようですね。

### 水平線・ページブレイク

一応確認のため。

#### Rmdコード

    ***

#### html

```html
<hr />
```

そのまんまです。

### Markdown形式の表

Markdownでの表の表現方法はいくつかあるのですが，ここではRStudioのHelpにある"Markdown Quick Reference"に記載されている書式で試します。

#### Rmdファイル

```md
ほげ|ふが
---|---
ほげほげ1|ふがふが1
ほげほげ2|ふがふが2
```

#### html

````html
<table>
<thead>
<tr class="header">
<th>ほげ</th>
<th>ふが</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>ほげほげ1</td>
<td>ふがふが1</td>
</tr>
<tr class="even">
<td>ほげほげ2</td>
<td>ふがふが2</td>
</tr>
</tbody>
</table>
````

試したコードでは表のヘッダー(いわゆる見出し行)とボディ(中身の行)を区別するような書き方をしていたのですが，それぞれthead要素とtbody要素にちゃんと分かれています。そして**各行に自動的に奇数・偶数を示すclassが付与されています**。これはPandocの仕様なんでしょうけど，知らなかった…。

### Rチャンクのコードと通常出力

それでは試します。まずは通常のものから。

#### Rmdのコード

    ```{r}
    head(iris)
    ```
#### html

```html
<pre class="r"><code>head(iris)</code></pre>
<pre><code>##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa</code></pre>
```

まず，Rのソースコード部分はpre要素>code要素となっていて，Markdownでのコードブロックと同じような扱いになってはいますが，classに`r`が付与されています。これでコードシンタックスハイライトでRが効くようになっているんだと思います。

そして出力部分については，pre要素>code要素になっています。なのでコードブロックの要素と同じように扱われます。

### knitr::kableによる表出力

R Markdownを利用している人なら誰もがお世話になる`knitr::kable`ではどうなるかを試します。

#### Rmdコード

    ```{r}
    knitr::kable(head(iris))
    ```

#### html

```html
<pre class="r"><code>knitr::kable(head(iris))</code></pre>
<table>
<thead>
<tr class="header">
<th align="right">Sepal.Length</th>
<th align="right">Sepal.Width</th>
<th align="right">Petal.Length</th>
<th align="right">Petal.Width</th>
<th align="left">Species</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="right">5.1</td>
<td align="right">3.5</td>
<td align="right">1.4</td>
<td align="right">0.2</td>
<td align="left">setosa</td>
</tr>
<tr class="even">
<td align="right">4.9</td>
<td align="right">3.0</td>
<td align="right">1.4</td>
<td align="right">0.2</td>
<td align="left">setosa</td>
(中略)
<tr class="even">
<td align="right">5.4</td>
<td align="right">3.9</td>
<td align="right">1.7</td>
<td align="right">0.4</td>
<td align="left">setosa</td>
</tr>
</tbody>
</table>
```

Rのコード部分は一つ前の分と変わりません。Markdown記法で表現した表と`knitr::kable`で出力した表での違いとしては，各セル(td要素)にalign属性が付与されている点です。これは`knitr::kable`は列の要素を見て，「数値なら右揃え，文字列なら左揃え」というルールを自動で割り当てる機能があるからです。詳しくはこの関数のヘルプを参照してください。

### plotの出力

Rチャンクで実行して出力されたplotを検討します。

#### Rmdコード

    ```{r}
    plot(1:10)
    ```

#### html

```html
<pre class="r"><code>plot(1:10)</code></pre>
<p><img src="selector_check_files/figure-html/unnamed-chunk-3-1.png" width="672" /></p>
```

Rのコード部分は前の分と同一です。出力はpngファイルとして出力され，それをimg要素で組み込み，それをp要素で覆っています。この素のままだと他の画像挿入用img要素とまざってcssで指定しづらいかも(てか以前そうなった)…。

## まとめ

思ったよりも素直なhtmlが返ってきてました。個人的には以下のところに気をつけたいです:

- headingが`div`要素に覆われ，idもclassも自動付与される
- 番号リストはタグ内でstlyeが指定される
- md記法で差し込んだ画像は`div.figure>img`という構造
- 表には自動で奇数行・偶数行を識別するclassが付与されている
- Rチャンクのコード部分は`pre.r`要素で覆われる
- Rチャンクで生成したplot画像は`p>img`という構造

これだけ抑えておけば，ある程度自分好みのスタイルを適用できるようになるのではないでしょうか。カスタムcssを設定していく方は参考にしてみてください。

**Enjoy!**

## 使用したRmdファイル

以下のとおりです:

    ---
    title: "セレクタの確認用"
    output:
      html_document:
        self_contained: false
    ---
    
    ということで，セレクタの確認するため一通り試してみる
    
    # 見出し1
    
    ## 見出し2
    
    ### 見出し3
    
    #### 見出し4
    
    ##### 見出し5
    
    ###### 見出し6
    
    イタリックのテストします。*ひとつめ*。_ふたつめ_。
    
    ボールドのテストします。**ひとつめ**。__ふたつめ__。
    
    - 番号なしリスト1
        - 番号なしリスト1-1
        - 番号なしリスト1-2
    - 番号なしリスト2
    - 番号なしリスト3
        - 番号なしリスト3-1
    
    1. 番号リスト1
        1. 番号リスト下1-1
        2. 番号リスト下1-2
    2. 番号リスト2
    3. 番号リスト3
        1. 番号リスト下3-1
    
    定義リスト1
    
    : 定義リスト1の中身
    
    定義リスト2
    
    : 定義リスト2の中身
    
    [リンク文字](https://kazutan.github.io/kazutanR/)
    
    https://kazutan.github.io/kazutanR/
    
    ![](pics/user.png)
    
    引用のテスト
    
    > Why are you using SJIS?
    
    コードブロックのテスト。
    
    ```
    > 1 + 1
    ```
    
    インライン用に`1+1`してみる。
    
    数式:
    
    $$
    y = x_1 + x_2
    $$
    
    インライン数式用に$\mu = 3.44$してみる。
    
    水平線・ページブレイク
    
    ***
    
    Markdownの表
    
    ほげ|ふが
    ---|---
    ほげほげ1|ふがふが1
    ほげほげ2|ふがふが2
    
    Rチャンクのテスト。まずは通常の。
    
    ```{r}
    head(iris)
    ```
    
    次は`knitr::kable()`。
    
    ```{r}
    knitr::kable(head(iris))
    ```
    
    plotのテスト。
    
    ```{r}
    plot(1:10)
    ```