All Posts

全ての記事をそのまま表示している。

とても重くなってしまっているかもしれない。

org-reveal の概要

Org-reveal

org-mode でスライドがかける

基本

org-mode の 1サブツリー = 1ページ

サブツリーを多めにして書けばそのまま読めるスライドになる

基本的な機能

試す

遅延表示

こんな

ふうに

一つづつ

出せる

リンク

Google

org-mode のものがそのまま使える

箇条書き

  • 普通に
  • 使える
  • 遅延表示にも対応

ソースコード

htmlize.el によって emacs と同じハイライトになる。

#include <iostream>

int main() {
  std::cout << "hello world" << std::endl;
  return 0;
}

(かなり嬉しい)

数式

MathJax が使える

\begin{align*} \sin^{2} x + \cos^{2} x = 1 \end{align*}

背景画像の変更

ここでは色を指定

(画像も指定できるけど、いい画像がなかった。)

Hack

スライドを埋め込めるようにする

org-reveal.el をちょっといじれば OK

Hack

埋め込んだスライドをフルスクリーンに切り替える

左下のボタンから

ちょっと javasctipt をかけば OK

本文にソースあり

full screen

org-reveal を使うと org-mode でスライドを書くことができる。

埋め込んだスライドのフルスクリーンを切り替えるためのjavascript

window.onload =
    (function(document, Reveal) {
        return function() {
            function save(elem) {
                elem.oldCssText = elem.style.cssText;
            }
            function hide(elem) {
                elem.style.display = "none";
            }
            function adjust(elem) {
                elem.style.padding = "0px";
                elem.style.margin = "0px";
                elem.style.maxWidth = "none";
            }
            function restore(elem) {
                elem.style.cssText = elem.oldCssText;
                delete elem.style.oldCssText;
            }
            function forEach(collection, f) {
                for (i = 0; i < collection.length; ++i) {
                    f(collection[i]);
                }
            }

            // to delete
            var header = document.getElementsByClassName("header");
            var post_meta = document.getElementsByClassName("post-meta");
            var prev_next_post = document.getElementsByClassName("prev-next-post");
            var content = document.getElementsByClassName("content");
            var menu = document.getElementById("menu");

            // to adjust
            var reveal = document.getElementsByClassName("reveal")[0];
            var main = document.getElementById("main");
            var layout = document.getElementById("layout");

            // save current css texts. (ugly, but works.)
            forEach(header, save);
            forEach(post_meta, save);
            forEach(prev_next_post, save);
            forEach(content, save);
            save(menu);
            save(main);
            save(reveal);
            save(layout);

            // this checkbox will be provided in posts.
            // for example "<input id="fullScreenFlag"> full screen"
            var checkbox = document.getElementById("fullScreenFlag");
            var to_fullscreen = function() {
                forEach(header, hide);
                forEach(post_meta, hide);
                forEach(prev_next_post, hide);
                forEach(header, adjust);
                forEach(post_meta, adjust);
                forEach(prev_next_post, adjust);
                forEach(content, adjust);
                hide(menu);
                adjust(main);
                adjust(layout);
                reveal.style.cssText = "";
                reveal.style.height = "100vh";
            }
            var to_windowed = function() {
                forEach(header, restore);
                forEach(post_meta, restore);
                forEach(prev_next_post, restore);
                forEach(content, restore);
                restore(menu);
                restore(main);
                restore(reveal);
                restore(layout);
                Reveal.layout();
            }
            checkbox.onchange = function() {
                if (checkbox.checked) {
                    to_fullscreen();
                } else {
                    to_windowed();
                }
            };
        }
    })(document, Reveal);

このスライドのもとになった org-mode ソース

org-mode でスライドがかける

** 基本

org-mode の 1サブツリー = 1ページ

サブツリーを多めにして書けばそのまま読めるスライドになる

** 基本的な機能

試す

** 遅延表示

#+ATTR_REVEAL: :frag t
こんな

#+ATTR_REVEAL: :frag t
ふうに

#+ATTR_REVEAL: :frag t
一つづつ

#+ATTR_REVEAL: :frag t
出せる

** リンク

[[https://www.google.co.jp/][Google]]

#+ATTR_REVEAL: :frag t
org-mode のものがそのまま使える

** 箇条書き

#+ATTR_REVEAL: :frag (none none t)
- 普通に
- 使える
- 遅延表示にも対応

** 表

| 名前 | スコア |
|------+--------|
| 田中 |     10 |
| 佐藤 |     15 |
| 斎藤 |      5 |

#+ATTR_REVEAL: :frag t :frag_idx 1
アラインには追加の css が必要

#+ATTR_REVEAL: :frag t :frag_idx 1
#+BEGIN_SRC css
.reveal .org-left {
    text-align: left;
}

.reveal .org-right {
    text-align: right;
}
#+END_SRC

** ソースコード

htmlize.el によって emacs と同じハイライトになる。

#+BEGIN_SRC C++
#include <iostream>

int main() {
  std::cout << "hello world" << std::endl;
  return 0;
}
#+END_SRC

#+ATTR_REVEAL: :frag t
(かなり嬉しい)

** 数式

MathJax が使える

#+ATTR_REVEAL: :frag t :frag_idx 1
\begin{align*}
\sin^{2} x + \cos^{2}  x = 1
\end{align*}

** 画像

例: ditaa

#+ATTR_REVEAL: :frag t
#+BEGIN_SRC ditaa :file org-reveal/org-reveal-example.png :exports result :eval no-export
+--------------------------------+
| /--------\ process  /--------\ |
| | data A +--------->| data B | |
| \--------/          \--------/ |
+--------------------------------+
#+END_SRC

#+ATTR_REVEAL: :frag t
#+RESULTS:
[[file:/org-reveal/org-reveal-example.png]]

** 背景画像の変更
:PROPERTIES:
:REVEAL_BACKGROUND: #123456
:REVEAL_BACKGROUND_TRANS: slide
:END:

ここでは色を指定

#+ATTR_REVEAL: :frag t
(画像も指定できるけど、いい画像がなかった。)

** Hack

スライドを埋め込めるようにする

#+ATTR_REVEAL: :frag t
org-reveal.el をちょっといじれば OK

** Hack

埋め込んだスライドをフルスクリーンに切り替える

#+ATTR_REVEAL: :frag t :frag_idx 1
左下のボタンから

#+ATTR_REVEAL: :frag t :frag_idx 2
ちょっと javasctipt をかけば OK

#+ATTR_REVEAL: :frag t :frag_idx 2
本文にソースあり


ox-hugo の概要

ox-hugo は emacs のパッケージだ。 org-mode の文章を Hugo に対応した markdown にエクスポートすることができ、このサイトの記事を書くのに使われている。

ox-hugo の特徴として、一つの記事が一つのファイルではなく一つのサブツリーに対応しているという点がある。 一つの org-mode ファイルの中にいくつも記事を書き、記事ごとにタイトルやタグを設定してエクスポートすることができる。 記事を書いている途中で過去の記事を確認したり手直しすることが簡単に行えるので都合がいい。

このサイトは一つの大きな(現在7000行ぐらい) org-mode ファイルからできていて、一つ一つの記事はサブツリーに対応している。

Figure 1: このサイトのもとになる org-mode ファイル (一部)

Figure 1: このサイトのもとになる org-mode ファイル (一部)

ox-hugo は紹介文が “A carefully crafted Org exporter back-end for Hugo” となっているだけあって、 かゆいところに手が届く機能が揃っている。例えば

  • org-mode で記事を TODO にするとエクスポートされたとき draft=true となる
  • org-mode のタグが hugo のタグになる
  • 記事ごとに tag 以外の taxonomies (layout, categories など) を設定できる
  • 記事ごとにエクスポート先のフォルダ名とファイル名を決められる
  • org-mode のファイルを保存するたびに自動でエクスポートが行われる

がある。

加えて ox-hugo のソースコードは大して長くないので、 気に入らない部分があれば好きに改造していける。 自分が施した変更はここから見れる。

参考資料

GitHub - kaushalmodi/ox-hugo: A carefully crafted Org exporter back-end for Hugo

GitHub - yuki67/dotemacs: My emacs configuration.



Hugo の C++ 用 シンタックスハイライトを直す

Hugo で C++ のコードをシンタックスハイライトしたら誤った位置に改行が入っていた。

Figure 1: 入力したソースコード

Figure 1: 入力したソースコード

Figure 2: 出力されたソースコード

Figure 2: 出力されたソースコード

調べたところ Hugo が使っているシンタックスハイライタ chroma のバグであることが分かった。 このバグは chroma の最新版(0.4.0)では直っていたので、 Hugo が最新版の chroma を使うようにしたところ直った。

手順は簡単で、

  • go get -v github.com/gohugoio/hugo
  • git checkout v0.37.1
  • Gopkg.toml 内の chroma のバージョンを0.4.0に直す
  • mageをインストールする
  • mage vendor
  • mage install

でできる。

しばらくすれば Hugo が chroma の最新版を使うようになるとは思うが、それまではこれで。

追記

最新の Hugo では直ったことを確認した。



MathJax 数式内のフォントを変更する

MathJax で書いた数式内の日本語のフォントが数式外の文章と異なる場合がある。

Figure 1: 数式内でフォントが異なる例

Figure 1: 数式内でフォントが異なる例

日本語(正確には「デフォルトのフォントに含まれていない文字」)に使うフォントを指定するコードを入れれば解決できる。

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
  "HTML-CSS": {
    undefinedFamily: "'Raleway', Helvetica, Arial, sans-serif"
  }
  });
</script>

以下は使用例。

数式外の文章

\begin{align*} y = x 数式内の文章 \end{align*}

追記

上の設定でうまく行ったと思ったのだが、しばらくして確認したら数式内のひらがなのフォントだけおかしくなった。

MathJax がデフォルトで使おうする STIX フォントにひらがな用のフォントが存在するのが原因なので、以下のようにして STIX フォントを使わないように設定すれば回避できる。

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
  "HTML-CSS": {
    // デフォルトが ["STIX","TeX"] なのを変更
    // [] にしても良い
    availableFonts: ["TeX"],
    undefinedFamily: "'Raleway', Helvetica, Arial, sans-serif"
  }
  });
</script>

参考資料

The HTML-CSS output processor — MathJax 2.7 documentation



org-babel の概要

org mode には org-babel という機能があり、orgファイルに書いたソースコードをその場で実行できる。

例えば org mode のファイルに python のソースコードを

#+BEGIN_SRC python :results output verbatim :exports both :eval no-export
def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

# 6! を出力する
print(fact(6))
#+END_SRC

というふうに書いたとする。 この状態からカーソルをソースコードの中に移動させて C-c C-c とすると python コードの実行され、以下のように実行結果が挿入される。

#+BEGIN_SRC python :results output verbatim :exports both :eval no-export
def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

# 6! を出力する
print(fact(6))
#+END_SRC

#+RESULTS:
: 720

この部分をエクスポートすると、

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

# 6! を出力する
print(fact(6))
720

となる。

org-babel は python の他にも様々な言語に対応しているので、コードを含んだ文章を書くのが楽になる。