鶴見教育工学研究所

blogdownでプログラムをSyntax highlightingする

Tags:

前の記事で、何行かのPythonプログラムを示しました。その際、これまでのブログの設定では、単にフォントがタイプライター体1になるだけで、関数や引数、演算子などの色付け、いわゆるハイライト (Syntax highlighting) はされませんでした。

文字 (プログラム) としてはもちろん何の問題もないのですが、やはりプログラムがハイライトされていたほうが技術ブログっぽい🤪ので、どうにかできないか調べていました。

時期によっていろいろなアプローチがあったようで、やや古い記事が多く引っかかりました。日本語の記事が出てこないのは、あまりニーズがないのでしょうか。2

特に2つ目はめちゃくちゃ面倒で、「ここまでしなきゃいけないならハイライトいらんわ」となっていたのですが、Stack Overflowに今年投稿された以下のQAでは、とても簡単にできることがわかりました。

何と言ってもblogdownパッケージの開発者のYihui Xie氏が回答しているので「正しい」はずです。…ですが、blogdownのフォルダーにある .Rprofile ファイルに options(blogdown.method = "markdown") と追記する方法は、私の環境ではハイライトされませんでした。

もうひとつ、.Rprofile ファイルにオプションを指定せず、記事ファイルの拡張子を .Rmarkdown とすると、常に .markdown ファイルが生成されます。(1.6 R Markdown vs. Markdown | blogdown: Creating Websites with R Markdown) こちらは、Visual Studio Codeでプレビューもされ、ハイライトも期待したとおりになされました。

実際に、ちょっと例を示してみましょう。今日、r-wakalang3にズレた投稿をしてしまったプログラムです。実行はしていません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# setup
import pandas as pd
from sklearn.datasets import load_iris

data,target = load_iris(as_frame=True,return_X_y=True)

# problem
data.columns.values[1] = "Width"
data.columns.values[3] = "Width"

# solution
new_columns = {1: "Width1", 3: "Width2"}

data.columns = [data.columns.values[i] if data.columns.values[i] != "Width" else new_columns[i] for i in range(len(data.columns))]

(たぶん) ハイライトされていると思います。Rのプログラムも書いてみます。

1
2
3
4
5
6
7
8
9
a <- 3
b <- 10
x <- 1:100
e <- rnorm(100, sd = 8)
y <- a * x + b + e
df <- data.frame(x, y)

p <- ggplot(df, aes(x, y)) + geom_point()
p

(たぶん) ハイライトされていると思います (2回目)。こちらは、実行もされてグラフィックスが表示されているはずです。これで、技術ブログっぽくなりました🤪


  1. お使いのブラウザでどう表示されるかは環境依存でしょうが。 ↩︎

  2. Syntax Highlightingのニーズか、blogdownでブログを書くニーズかわかりませんが。 ↩︎

  3. r-wakalangは、RユーザーのSlackコミュニティです。 ↩︎