2015年12月11日金曜日

再発生:Windows UpdateでCPUの使用率が長時間100%になる

windows update スタンドアロンインストーラを使う

月例 Windows Update を行なうと CPU の使用率が長時間 100% になる現象が再発しています。確か 2 年前の今頃も同じような現象が起こった事を思い出しました。今回の発生対象も前回と同様に、シングルコア CPU の PC だけのようです。

2 年前に Windows XP でこの被害を受けた PC は、現在は Windows 7 に入れ替えています。主に軽い処理担当として今でも元気に活躍しているのですが、シングルコアの為 CPU 使用率が長時間 100% になると「とても」使いづらくなります。そこで、前回の記録を参考にして更新プログラムの手動インストールを行なってみました。

手動インストールの手順

今回の使用環境は windows 7 Home 32-bit です。OS バージョンが違う環境では、この方法で改善できないかも知れませんので注意してください。また、OS バージョンが違う環境では、その環境に合わせた更新プログラムが必要であることにも注意してください。

更新プログラムは以前よりも探しやすくなっていますが、以前のように「Internet Explorer 用の累積的なセキュリティ更新プログラム」の手動インストールだけでは解決せず、今回は、「リモートでのコード実行に対処する Microsoft Graphics コンポーネント用のセキュリティ更新プログラム (3104503)」の手動インストールも必要でした。

  1. Windowsの自動更新を無効にする

    自動更新が始まるとSvchost.exeの CPU 使用率が 100% になってしまいます。このままでは操作に支障をきたすため、一時的な措置として Windows の自動更新を無効に設定します。

  2. 更新プログラムを取得

    1. マイクロソフトのセキュリティパッチ情報

      マイクロソフトの セキュリティ TechCenter の web サイトに行き最新セキュリティ情報から、適用する更新プログラムの情報を調べます。項目のタイトル名は、例えば今月(2015年12月)なら「2015 年 12 月のセキュリティ情報」です。

      2015 年 12 月のマイクロソフト セキュリティ情報の概要:
      https://technet.microsoft.com/ja-jp/library/security/ms15-dec.aspx

    2. ページ内の「影響を受けるソフトウェア 」セクションまでスクロールして、「Windows オペレーティング システムとコンポーネント (表 1/2)」一覧表内の自分の使用環境の OS 項目を探します。

      例えば、使用環境が windows 7 32-bit, Internet Explorer 11 の場合、「セキュリティ情報 ID」の「MS15-124」と「MS15-128」のリンクから、それぞれのセキュリティ情報の詳細ページへ移動して更新プログラムを取得します。

    3. セキュリティ情報の詳細ページ内の「影響を受けるソフトウェア」セクションの一覧表の中から、自分の環境に合ったダウンロード対象のリンクを探します。

      例えば、「マイクロソフト セキュリティ情報 MS15-124」では、「Internet Explorer 11」の項目から「Windows 7 for 32-bit Systems Service Pack 1」を探します。

      ここで「Internet Explorer 11 (KB3104002)」のリンクをクリックすると、ダウンロードセンターに移動して更新プログラムを取得できます。

      Windows 7 用 Internet Explorer 11 の累積的なセキュリティ更新プログラム (KB3104002) from Official Microsoft Download Center:
      https://www.microsoft.com/ja-jp/download/details.aspx?id=50346

      私の環境用のダウンロードファイルはIE11-Windows6.1-KB3104002-x86.msuでした。

      つづいて「MS15-128」も同様に取得します。「マイクロソフト セキュリティ情報 MS15-128」では「Windows 7」の項目から「Windows 7 for 32-bit Systems Service Pack 1 (3109094)」を探します。

      ここで「Windows 7 for 32-bit Systems Service Pack 1 (3109094)」のリンクをクリックすると、ダウンロードセンターに移動して更新プログラムを取得できます。

      Windows 7 用セキュリティ更新プログラム (KB3109094) from Official Microsoft Download Center:
      https://www.microsoft.com/ja-jp/download/details.aspx?id=50311

  3. 更新プログラムを手動インストール

    ダウンロード後、ファイルを実行すると 「windows update スタンドアロンインストーラ」が起動して更新プログラムのインストールが始まります。ここでは、更新プログラム毎にファイルを実行してインストールを行ないます。

  4. Windowsの自動更新を有効に戻す。

    更新プログラムをインストール後、PC を再起動します。再起動後に自動更新の設定を有効に戻します。

  5. 自動更新を行う。

    この後、残りの更新プログラムをインストールするため Microsoft Update を実行して通常の自動更新を行います。

少し手間がかかりますが、今月はこの方法でうまくいきました。

2015年11月19日木曜日

Firefox WebIDE起動時のエラー

WebIDE を起動すると 「プロジェクトを読み込めません。新しいバージョンの Firefox のプロファイルを使用した場合に発生する可能性があります。」 のエラーメッセージが表示されました。今回の発生環境は Firefox 42.0 (release: 20151029151421) Windows 7 です。

実はこのエラーは 以前の投稿 で発生して以来、今日まで解決方法が見つからずに引きずっていました。このエラーの状態ではインストール済みのシミュレータも認識してくれませんでした。

エラーメッセージ横の「トラブルシューティング」ボタンのリンクをクリックすると 「 WebIDE のトラブルシューティング」 の web ページが開きます。内容を一読して 「プロジェクトの一覧を読み込みできない 」 のデータベースファイルの削除を試しましたが改善できず、「アドオンを無効化して再起動」も効果無しでした。


「Firefox のリフレッシュ」で解決

当初このエラーは release 版の不具合かと思っていたのですが、Linux 環境の release 版 ( Firefox 42.0 (release: 20151029151421) Ubuntu 14.04 LTS ) で試してみたところ、問題なく動作することを確認できました。もしやと思い「Firefox のリフレッシュ」を行なったところ、あっけなく問題は解決されて正常に動作するようになりました。

結果としてエラー原因を特定できたわけでは在りませんが、「Firefox のリフレッシュ」によってこの不具合を解決することができました。「トラブルシューティング」のデータベースファイルの削除でも解決できない場合は、「Firefox のリフレッシュ」をお薦めします。


他の不具合も解消

実は今回の「Firefox のリフレッシュ」で解消した不具合が他にもあります。ひとつは CSS filter のプリセット値の保存です。 前述の WebIDE の起動時エラーの対処のために「Firefox のリフレッシュ」を行なう前は CSS filter のプリセット値の「保存」ボタンを押しても保存できませんでした。ところが「Firefox のリフレッシュ」後に再度試してみると、今度は問題なく保存できるようになりました。

もうひとつ、webコンソールの コマンドライン履歴が保存されない不具合 もあったのですが、この不具合も「Firefox のリフレッシュ」後に解消してコマンド履歴を保存できるようになりました。

「Firefox のリフレッシュ」はインストール済みのアドオンを削除することもあって、リフレッシュ後のアドオンの再インストールや再設定の煩わしさのために避けていたのですが、今回の「Firefox のリフレッシュ」では、その効果を体感することができました。


Firefox のリフレッシュの前にやっておくこと

「Firefox のリフレッシュ」を行なう前に、インストール済みのアドオンの一覧を保存しておくと再インストール作業に役立ちます。保存するにはメニューのトラブルシューティング情報about:supportを開き、「テキストをクリップボードにコピー」を使ってテキストファイルに保存しておきます。こうしておくと「Firefox のリフレッシュ」後にアドオンを再インストールするときに参照できます。インストール済みのアドオンの一覧は「拡張機能」の項目に記載されています。

それから再インストール後のアドオンのために、設定のエクスポートの方法をアドオンの HELP や設定画面で確認しておくと役立ちます。確認後はアドオン設定のエクスポートをしておきましょう。エクスポートできない場合はアドオン設定の内容をメモしておくとか設定画面のスクリーンショットを残しておくと役立ちます。


ユーザーが追加したアドオンの設定の移行

以下にエクスポート機能が無いアドオン設定の移行手順を紹介します。

  • Greasemonkeyアドオンのユーザースクリプトを新しいプロファイルへ移行するには、デスクトップに作成された「バックアップ・プロファイル」の gm_scriptsフォルダを新しいプロファイルへコピーします。

  • Stylishアドオンのユーザースタイルを新しいプロファイルへ移行するには、同様に「バックアップ・プロファイル」の stylish.sqliteファイルを新しいプロファイルへコピーします。

  • firelinkアドオンの設定はクリップボード経由でエクスポートできます。事前に設定内容をテキストファイルに保存しておくと役立ちます。

新しいプロファイルフォルダを開くには、メニューのトラブルシューティング情報をクリック後、「アプリケーション基本情報」項目のプロファイルフォルダにある「フォルダを開く」ボタンをクリックすると、プロファイルフォルダを開くことができます。

また、開発ツールバー(Shift + F2)のコマンドラインから、プロファイルフォルダを開くことも可能です。その場合はfolder openprofileコマンドを入力します。


ユーザーが追加した検索エンジンの移行

検索バーに追加した検索エンジンの移行も同様です。「バックアップ・プロファイル」の searchpluginsフォルダを新しいプロファイルへコピー後、Firefoxの再起動後に有効になります。


まとめ

Firefox の開発ツールの動作に不具合がある場合、「Firefox のリフレッシュ」が有効なことがわかりました。あわせて、アドオン設定のバックアップについても事前に調べておくことで、再設定時の作業にとても役立ちます。

参考:

2015年7月29日水曜日

TiddlyWikiでGravizoを使ってグラフを書く

Gravizo はグラフのレンダリングエンジン Graphviz を使った Web サービスです。 DOT 言語で記述したテキストを渡すと画像データを返してくれます。



HTML イメージタグで使う場合

Gravizo のサンプル HTML によると、イメージタグの中に DOT テキストを記述して使います。

このように記述すると

<img src='https://g.gravizo.com/g?
 digraph G {
   main -> parse -> execute;
   main -> init;
   main -> cleanup;
   execute -> make_string;
   execute -> printf
   init -> make_string;
   main -> printf;
   execute -> compare;
 }
'/>

このようにグラフが表示されます。



TiddlyWiki で使う場合

Gravizo を TiddlyWiki で使う場合はどうでしょうか。 Tiddly 記法でグラフを書く場合はイメージ書式を使って、このように記述します。

[img[https://g.gravizo.com/g?
 digraph G {
   main -> parse -> execute;
   main -> init;
   main -> cleanup;
   execute -> make_string;
   execute -> printf
   init -> make_string;
   main -> printf;
   execute -> compare;
 }
]]

実際の実行画面は icm7216.github.io/MyTiddlyWiki/ - Gravizo on tiddler で確認できます。

ところが DOT テキストの内容によってはイメージ書式として正しく認識できない場合があります。これは TiddlyWiki のイメージ書式のパーサーが、クエリ文字列のパースに失敗するのが原因のようです。

例えばこのような DOT テキストです

[img[https://g.gravizo.com/g?
digraph G {
  node [shape=plaintext]
  a [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2" ROWSPAN="2">two</TD></TR>
              <TR><TD PORT="3">three</TD></TR>
            </TABLE>>];
  b [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2">two</TD></TR>
              <TR><TD PORT="3" COLSPAN="2">three</TD></TR>
            </TABLE>>];
  a:1 -> b:2;
  b:1 -> a:2;
  b:3 -> a:3;
}
]]

クエリ文字列のパースに失敗した出力

こんな場合は html タグを使うとうまくいきます。 html タグを使えば tiddler の中に生HTMLを記述することができます。

このように記述します

<html>
<img src='https://g.gravizo.com/g?
digraph G {
  node [shape=plaintext]
  a [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2" ROWSPAN="2">two</TD></TR>
              <TR><TD PORT="3">three</TD></TR>
            </TABLE>>];
  b [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2">two</TD></TR>
              <TR><TD PORT="3" COLSPAN="2">three</TD></TR>
            </TABLE>>];
  a:1 -> b:2;
  b:1 -> a:2;
  b:3 -> a:3;
}
'/>
</html>

このようなグラフが tiddler に表示されます。



tiddler マクロと組み合わせる

以前の投稿 で紹介した便利機能、 tiddler トランスクルージョンを使ってみましょう。

Graphviz 用の tiddler トランスクルージョンを "embed" tiddler に記述します。

!graphviz
<html>
<img src='https://g.gravizo.com/g?$1'/>
</html>
!end


Graphviz 用の tiddler トランスクルージョンの使い方

マクロの引数の DOT テキストを、シングルクオートで囲んで渡してやります。

<<tiddler [[embed##graphviz]] with:'
  ここにDOTテキストを記述します
'>>

記述例

<<tiddler [[embed##graphviz]] with:'
digraph G {
  node [shape=plaintext]
  a [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2" ROWSPAN="2">two</TD></TR>
              <TR><TD PORT="3">three</TD></TR>
            </TABLE> >];
  b [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
              <TR><TD PORT="1">one</TD><TD PORT="2">two</TD></TR>
              <TR><TD PORT="3" COLSPAN="2">three</TD></TR>
            </TABLE> >];
  a:1 -> b:2;
  b:1 -> a:2;
  b:3 -> a:3;
}'>>


tiddler マクロで graphviz を使う場合の注意点

マクロ引数の DOT テキストの中に<< ... >>の記述があるとパースに失敗します。

このように表示されます

Tiddly 記法では、例えば<<TABLE ... >>の記述があると TABLE マクロの呼び出しと解釈してしまいます。そこで、このような場合はスペースを追加して< <TABLE ... > >のように記述するとうまくいきます。

2015年5月15日金曜日

PandocとLuaLaTeXを使ったPDF出力でコードブロックをきれいに表示する

ドキュメント変換ツール Pandoc の LaTeX を使った PDF 出力。

この投稿では前回の HTML 変換に引き続いて、Pandoc を使って Markdown テキストを PDF へ変換する方法を書いています。

使用環境:Windows7 64bit, pandoc 1.13.2, TeXLive 2014



LuaLaTeX

Pandoc の PDF 出力の場合、標準では pdfLaTeX が使われます。本家の Web サイトでは pdfLaTeX をサポートした MiKTeX を薦めていますが、日本語テキストを扱う場合は LuaLaTeX がお薦めです。この LuaLaTeX では日本語組版に対応した LuaTeX-ja パッケージがサポートされています。

Windows 環境への LuaLaTeX のインストールは TeX Live を使います。専用のインストーラが用意されているので簡単にインストールできます。


TeX Liveとは

TeX Live は TeX のディストリビューションのひとつで TeX 環境がこのディストリビューションパッケージにまとめられています。現在では日本語組版に必要な要素のほとんどすべてがまるっと取り込まれているので、TeX Live をインストールするだけで日本語文書を扱うことができます。


TeX Live 2014をインストール

今回は TeX Live 2014 インストール用 DVD を作成してインストールしました。 出来上がった DVD の中の install-tl-windows.bat を実行するとインストールを開始できます。インストールに要した時間は DVD インストールでは約 1 時間でした。また別件で DVD の内容全てを HDD 上にコピー後(ISO ファイルがマウントできるならコピー不要)インストールした場合では約 30 分でした。HDD 上でインストール作業が可能な場合は後者がお勧めです。

TeX Live の最新版 TeX Live 2014 の ISO イメージファイル

TeX Live をインストールすると TeX の総合環境 TeXworks が付いてきます。LaTeX ファイルの動作確認など便利に使えます。

参考: インストール後の TeXworks の日本語環境の設定等が分かりやすく書かれています。



PDF出力を試してみる

はじめに Markdown テキストを PDF ファイルに変換してみましょう。

  1. コマンドプロンプトからpandoc -o hello.pdfを入力
  2. #Hello Pandocを入力
  3. Crtl + Zキーを押してEOFを入力
>pandoc -o hello.pdf
#Hello Pandoc
^Z

問題が無ければカレントフォルダにhello.pdfが出力されているはずです。

このように TeX Live を使えば Pandoc から簡単に PDF 出力できるようになります。



日本語を含んだMarkdownファイルをPDFに変換する場合

日本語文章を PDF 出力する場合は、日本語に対応したLaTeX エンジンとドキュメントクラスを Pandoc に指定して変換します。

たとえば LaTeXエンジンに LuaLaTeX を指定、ドキュメントクラスに ltjarticle を指定する場合は、コマンドにこのオプションを追加します。

--latex-engine=lualatex -V documentclass=ltjarticle

Pandoc のデフォルトエンコーディングは UTF-8 になっています。そのため、コマンドプロンプトから入力した日本語テキストを標準入力から Pandoc に入力すると、内部エンコードの違いでうまくいきません。ここでは入力用の Markdown ファイルを作成して試すことにします。

はじめに任意の Markdown テキストを記述したファイルを作成して UTF-8 でファイルを保存します。 この例ではファイル名input.mdで保存します。

input.md
#こんにちはPandoc

次のコマンドを実行して PDF へ変換します。

pandoc -f markdown input.md -s -o output.pdf ^
--latex-engine=lualatex ^
-V documentclass=ltjarticle

カレントフォルダにoutput.pdfが出力されているはずです。

この例で Pandoc は、入力されたファイルを LaTeX 形式に変換後 LuaLaTeX を経由して PDF を出力しています。このとき-sオプションによって LaTeX 用のテンプレートが適用されています。

ここで、入力した Markdown 形式の内容が、どのように LaTeX 形式に変換されたのかを知るには、出力ファイルを LaTeX 形式に指定することで確認できます。

pandoc -f markdown input.md -s -o output.tex ^
--latex-engine=lualatex ^
-V documentclass=ltjarticle

出力されたファイルoutput.texを TeXworks で開き、LuaLaTeX でタイプセットすると PDF 出力と同じ内容のプレビューを TeXworks で確認することができます。

用紙サイズやマージンの指定は-V geometry:を使うと便利です。

A4用紙に設定する

-V geometry:a4paper

マージンを1cmに設定する

-V geometry:margin=1cm


文書クラス(ドキュメントクラス)

文書クラスは LaTeX の文章の体裁や論理構造を決める情報ファイルです。LaTeX でよく使われる文書クラスは article, book, report などがあります。 (ファイルの拡張子は .cls )

日本語に対応した標準的な文書クラスはjsclassesです。接頭辞のjsは(Japanese Standard)の意味を含んでいるそうです。このファイルは新しい標準的な文書クラスとして 2000 年に公開されました。

  • jsarticle.cls (標準的な横書き論文・レポート)
  • jsbook.cls (標準的な横書き書籍)


LuaLaTeX用の文書クラス

LuaLaTeX で使用する文書クラスは jsclasses を LuaTeX-ja 用に調整されたものがあります。 LuaLaTeX では接頭辞にltが付いた文書クラスltjsclassesなどを使用します。

インストールフォルダを調べると下記のクラスファイルが見つかりました。Pandoc での動作確認結果と合わせて一覧に示します。

デフォルトインストールではこのフォルダに入っています。
C:\texlive\2014\texmf-dist\tex\luatex\luatexja

クラスファイル名 Pandocで使用の可否
ltjarticle.cls OK
ltjreport.cls OK
ltjbook.cls OK
ltjltxdoc.cls OK
ltjsarticle.cls OK (ただし要パッチ)
ltjsbook.cls NG (エラー発生)
ltjskiyou.cls NG (エラー発生)
ltjspf.cls NG (エラー発生)

LuaLaTeX で ltjsarticle を指定するとエラーが発生しましたが、この情報を参考にパッチを当てると使えるようになりました。



PDFのコードブロックをきれいに表示する。

実際に Markdown を PDF 変換してみると分かるのですが、Pandoc で出力したコードブロックはシンプルすぎて本文とコードブロックの違いが分かり難かったり、コードブロックの行の折り返しが行われず行が長くなると右側にはみ出た部分が途切れてしまい良くありません。

この場合 Pandoc の--listingsオプションを使うと、コードブロックの表示を良い感じに設定できます。



Pandoc: --listingsオプション

--listingsオプションの有無の違いをコマンドラインで確認してみましょう。

Pandoc 標準のコードブロック

>pandoc -t latex
```
puts "Hello Pandoc"
```
^Z
\begin{verbatim}
puts "Hello Pandoc"
\end{verbatim}

標準の PDF 出力のコードブロックは LaTeX の verbatim 環境に変換されるようです。これは入力どおりの内容をそのまま出力するもので、改行以外の文字で折り返すことなくそのまま表示されます。

つぎは、Pandoc --listingsオプション付きのコードブロック

>pandoc -t latex --listings
```
puts "Hello Pandoc"
```
^Z
\begin{lstlisting}
puts "Hello Pandoc"
\end{lstlisting}

このように、--listingsオプションを付けるとコードブロックが verbatim 環境から lstlisting 環境に変わります。この例では文字が入れ替わっただけの違いしか有りませんが、lstlisting 環境では行の折り返しは勿論のこと、シンタックスハイライトや行番号表示などが可能になります。

lstlisting 環境の設定はコマンドラインで指定すると冗長になるので、あらかじめ別ファイルlistings-setup.texに設定を書いておきます。

コードの先頭 4 行は lstlisting 環境の設定とは関係ありません。ここではフォント埋め込みや用紙サイズ、数式のためのパッケージの設定等を合わせて設定しています。

listings-setup.tex

コードブロックに listings 設定ファイルを適用するには、-H xxx.texオプションで指定します。その場合次のコマンドを実行します。

pandoc -f markdown input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf

GFM の場合

pandoc -f markdown_github+fenced_code_attributes ^
input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf


コードブロックの書き方



LaTeX の lstlisting 属性の記述方法も可能のようです。

この例ではコードブロックの左に行番号を表示、開始番号を 10 に指定、コードブロックのキャプションを設定しています。

```{language=Ruby numbers=left startFrom=10 caption="\{This is caption of code block\}"}
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



Pandoc の属性記述方法の場合

この例では言語をRuby、行番号を表示、開始番号を 1 に指定しています。

```{ .ruby .numberLines startFrom="1"}
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



Pandoc の属性記述方法(言語名のみ)

```ruby
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



LaTeXコマンドを使う

Markdown の PDF 化では、HTML 出力したファイルをブラウザの PDF プリンタを経由して PDF ファイルに保存することができますが、改ページの位置を PDF プリンタに委ねなければなりません。Pandoc を使って Markdown から PDF を出力する場合は、テキスト内に LaTeX コマンドを記述して改ページをコントロールすることができます。あわせて、拡張書式tex_math_dollarsを有効にしておくと、数式にインライン数式の$...$が使えるので便利です。

Markdown テキストの中に LaTeX コマンドを記述する場合、記述方法で注意することがあります。 というのも、HTML 出力で MathJax を使う場合では数式と LaTeX コマンドの両方を$...$の中に記述できます。いっぽうで、PDF 出力の場合では LaTeX を経由するため$...$は数式モードを表します。そのため数式モードで使えないコマンドを$...$の中に記述するとエラーになる場合があります。

LaTeX コマンドを使って改ページする場合は、テキスト内の改ページしたい位置にnewpageコマンドをそのまま記述します。

\newpage

コマンドラインでは、拡張書式raw_textex_math_dollarsを追加して実行します。 GFM の場合このようなコマンドになります

pandoc -f markdown_github-hard_line_breaks^
+raw_tex+tex_math_dollars^
+fenced_code_attributes ^
input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf


まとめ

Markdown テキストから簡単に PDF 出力できる Pandoc の便利さを改めて感じました。また、これまでは MathJax の数式でしか LaTeX 環境に触れたことが無かったのですが、今回の TeX Live のインストールを期に、ほんの少しですが LaTeX の世界について知ることができました。もっと LaTeX コマンドを使いこなせるようになれば活用方法が広がりそうです。

参考:

Pandocの紹介記事

TeX Liveの解説

Pandocの--listingsオプション設定ファイルの使い方

lstlisting 環境の詳細は The Listings Package listings.pdf に書かれています。

Pandoc には他にも多くの機能があります、興味を持った方はユーザーズガイドを読んでみてください。

本家ユーザーズガイド

日本語ユーザーズガイド

2015年5月9日土曜日

PandocのHTML出力でGFMとカスタムテンプレートを使う

PandocでMarkdownをHTMLへ変換

ドキュメント変換ツール Pandoc は様々な入出力形式に対応したコマンドラインツールです。多くの派生版 Markdown への対応や Pandoc による拡張 Markdown などの機能があり、柔軟な Markdown 変換ツールとして興味深いツールです。また、LaTeX を使った PDF 出力機能もそのひとつです。

この投稿では Pandoc を使って Markdown テキストを HTML へ変換する方法を簡単に紹介しています。

使用環境:Windows7 64bit, pandoc 1.13.2, Firefox 37.0.2



Pandocをインストール

Windows 用をダウンロード

最新版 pandoc-1.13.2-windows.msi をインストール。



Pandocを使ってみる

インストールが完了したら手始めに Pandoc の動作確認を兼ねて、Markdown テキストを HTML に変換してみましょう。ここではファイルを使わずに標準入出力を使って試します。

  1. コマンドプロンプトでpandocと入力
  2. #Hello Pandocを入力
  3. Crtl + Zキーを押して EOF を入力
  4. HTML に変換された結果が画面に表示されます。

      >pandoc
      #Hello Pandoc
      ^Z
      <h1 id="hello-pandoc">Hello Pandoc</h1>
      

このように入出力ファイルを指定しない場合 Pandoc は入力に標準入力を、出力に標準出力を使用します。また、入出力フォーマットを明示しない場合は入力フォーマットに Markdown を、出力フォーマットに HTML が選ばれます。

実際の Markdown テキストを HTML へ変換する場合は入出力ファイルやフォーマット、テンプレートなどを指定して使います。

pandoc -f markdown input.md -t html5 -s -o output.html

コマンドラインの-sオプションで標準テンプレートを指定すると、出力フォーマットに合わせた標準テンプレートが選択されます。この例の場合、適用されるのは HTML 出力用のhtml5テンプレートです。

html5テンプレートの内容は次のコマンドで確認できます。

pandoc -D html5

また css や MathJax の設定(後述)を含んだカスタムテンプレート(後述)を使用することも可能です。



MarkdownファイルをHTMLファイルへ変換する例

Pandoc では標準の Markdown のほか "GitHub flavored Markdown" もサポートされています。このフォーマットを使用する場合は入力フォーマットにmarkdown_githubを指定します。

  • markdown_github オプションを使って HTML に変換

    pandoc -f markdown_github input.md -t html5 -s -o output.html
    
  • markdown_github オプションで CSS を含んだ HTML に変換。

    pandoc -f markdown_github input.md -c github.css -t html5 -s -o output.html
    

    この例ではカレントフォルダのgithub.cssが HTML 内にリンクされます。このファイルは、はじめから Pandoc に同梱されているわけではないので自分で用意する必要があります。例えば"Github Markdown CSS - for Markdown Editor Preview"などを参考にして作成します。



「段落内の強制改行」を無効化する

Pandoc の拡張 Markdown では、フォーマット名と拡張文字列を使って機能をコントロールします。フォーマット名に拡張文字列を+で結合するとその機能を有効に、-で結合するとその機能が無効化されます。

この例では-hard_line_breaksを結合して「段落内の強制改行」を無効化しています。

pandoc -f markdown_github-hard_line_breaks ^
input.md -c github.css -t html5 -s -o output.html


Markdownテキストに生HTMLを記述

標準の Markdown では、テキスト内に記述した生の HTML はそのまま出力されます。Pandoc でこの機能を有効にするには+raw_htmlオプションを使います。これで Markdown テキスト内に生の HTML を記述できるようになります。

pandoc -f markdown_github+raw_html ^
input.md -c github.css -t html5 -s -o output.html


コードブロックの行番号表示とシンタックスハイライト

GFM の"Fenced code blocks"は、コードブロックを貼り付ける時のインデントが不要なのでとても便利です。

さらに Pandoc は行番号表示やシンタックスハイライトまでサポートしています。この機能を有効にするには+fenced_code_attributesオプションを使います。

pandoc -f markdown_github+fenced_code_attributes ^
input.md -c github.css -t html5 -s -o output.html

例えば、言語に"Ruby"を指定、行番号を表示、開始行を 100 に指定する場合は、コードブロックの属性値をこのように記述します。開始行のstartFrom="100"を省略すると 1 から始まります。

```{.ruby .numberLines startFrom="100"}
puts 'Hello Pandoc!'
```

生成される HTML はこのようになります。.ruby.numberLinesの記述からわかるように、この値はクラスに設定されます。もちろん#fooなら ID に設定されます。

<table class="sourceCode ruby numberLines" startFrom="100">
  <tr class="sourceCode">
    <td class="lineNumbers">
      <pre>100</pre>
    </td>
    <td class="sourceCode">
      <pre>
        <code class="sourceCode ruby">
          puts <span class="st">&#39;Hello Pandoc!&#39;</span>
        </code>
      </pre>
    </td>
  </tr>
</table>

コードブロックのシンプルな記述方法は言語名だけを記述します。この場合はシンタックスハイライトのみ行われます。

```ruby
puts 'Hello Pandoc!'
```

生成される HTML では言語名がクラスに設定されています。

<pre class="sourceCode ruby">
  <code class="sourceCode ruby">
    puts <span class="st">&#39;Hello Pandoc!&#39;</span>
  </code>
</pre>


数式を含んだHTMLを出力する

HTML で数式を扱う場合 MathJax を使うと便利です。MathJax は、数式や LaTeX コマンドを解釈してブラウザで表示できるように変換してくれます。

Markdown の記述に GFM の書式を使い css を追加、MathJax で数式を表示する場合はこのようなコマンドを実行します。

pandoc -f markdown_github-hard_line_breaks ^
input.md -c github.css -t html5 -s ^
--mathjax=https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML ^
-o output.html


カスタムテンプレートを使う

カスタムテンプレートを作っておくと、あらかじめ MathJax のオプション設定や css ファイル等を追加することができます。カスタムテンプレートを簡単に作るには、標準のテンプレート雛形として利用します。

はじめに、次のコマンドを実行してカスタムテンプレートmytemplate.htmlを作成します。

pandoc -D html5 > mytemplate.html

このテンプレートを使用する場合は、コマンドに--mytemplate=mytemplate.htmlオプションを追加します。

pandoc -f markdown input.md -t html5 ^
--template=mytemplate.html -o output.html

カスタムテンプレートの例

次のコードをカスタムテンプレートの</head> の直前に追加すれば、css ファイルと MathJax オプションの設定ができます。

この例ではカレントフォルダの github.css をリンクしています。また、MathJax のオプション設定では日本語の数式メニューやエラーメッセージの表示、数式のズーム設定。インライン数式のデリミタに$...$を使用できるようにしています。

<link rel="stylesheet" href="github.css">
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    menuSettings: {locale: "ja"},
    extensions: ["tex2jax.js", "MathMenu.js", "MathZoom.js"],
    TeX: {
      extensions: ["AMSmath.js", "AMSsymbols.js", "noErrors.js", "noUndefined.js"],
      noErrors: {disabled: true},
      noUndefined: {disabled: true}
    },
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
      inlineMath: [["$$","$$"], ["\\(","\\)"]],
      displayMath: [["$$$$","$$$$"], ["\\[","\\]"]],
      processEscapes: true
    }
  });
</script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML" type="text/javascript"></script>

インライン数式のデリミタ$...$について

インライン数式のデリミタは、他にもう一つの設定方法があります。それは、Pandoc の Markdown 拡張書式に、tex_math_dollarsを追加して--mathjaxオプションを指定します。この場合入力テキスト中の$...$\(...\)に、$$...$$\[...\]に変換して出力されます。

2つの設定方法の違い

  • MathJaxのオプションで設定する場合

    テンプレートファイルにtex2jax: { ... }を記述してインライン数式の$...$を有効にする場合は、単独の$記号を表示するときにエスケープしなければなりません。例えばPrice: $100を表示するにはPrice: \$100と記述します。

  • Pandocのオプションで設定する場合

    Pandoc の Markdown 拡張書式tex_math_dollarsの追加と--mathjaxオプションを指定する場合は、Pandoc が$で囲まれた範囲を認識して、数式か数式でないかを判断してくれます。そのためPrice: $100の表示では$記号のエスケープが不要になります。

記述の容易さでは後者の Pandoc オプションで設定するほうが便利かもしれません。その場合は上記コードのtex2jax: { ... }の部分を削除することで、デリミタ以外の MathJax オプションをテンプレートファイルで設定することができます。

後者の Pandoc オプションで設定する場合は次のようなコマンドを実行します。

pandoc -f markdown_github-hard_line_breaks+tex_math_dollars ^
input.md -t html5 --mathjax ^
--template=mytemplate.html ^
-o output.html

テンプレート内に MathJax スクリプトを記述している場合コマンドラインの--mathjaxオプションの指定は不要に思えますが、MathJax が受け取る TeX 形式で数式を出力するためにこのオプションが必要です。なぜなら Pandoc のデフォルトの数式出力では可能な限り Unicode 文字で数式を出力しようとします。



YAMLメタデータブロック

テンプレート内のプレースホルダ($記号で囲まれた変数)を使うと、テンプレートにメタデータを流し込むことができます。Pandoc ではメタデータの流しこみ用にいくつかの方法が用意されていますが、 YAML メタデータブロックを使うと汎用性が高まります。

Pandoc のテンプレートに YAML メタデータブロックを流し込む場合はあらかじめメタデータブロックを別ファイルまたは Markdown テキストの中に作成しておきます。 YAML メタデータブロックは---で始まり、---または...で終ります。

  • テキスト中に記述する場合の注意点は、YAML メタデータブロックの直前に空行を入れることです。ただし、テキストの先頭に記述する場合に限り、この空行は不要です。

  • 別ファイルに作成した YAML メタデータブロックを使用する場合はコマンドラインでファイル名を指定します。例えば YAML メタデータブロックを記述したファイルtest.yamlを指定する場合、次のようなコマンドを実行します。

pandoc -f markdown input.md test.yaml ^
-s -c github.css -t html5 ^
-o output.html

GFM の場合は+yaml_metadata_blockオプションを使います。

pandoc -f markdown_github+yaml_metadata_block ^
input.md test.yaml -s -c github.css -t html5 ^
-o output.html

複数の入力ファイルを指定した場合 Pandoc は、処理を開始する前にファイルとファイルの間に空行を追加してそれぞれのファイルを結合します。前述の YAML メタデータブロックの直前に空行を入れる理由はこのためです。



YAMLを使ったテンプレートの使用例

デフォルトテンプレートには、いくつかのプレースホルダが既に用意されています。実際に YAML メタデータの流し込みを試してみましょう。次の例では入力ファイルinput.mdのテキストの先頭に YAML メタデータブロックを記述しています。

input.md

---
pagetitle: YAMLテスト
title: YAML メタデータテスト
subtitle: サブタイトル
author:
- foo
- bar
date: May 5, 2015
---

#こんにちはPandoc

デフォルトテンプレートを使用するため-sオプションでコマンドを実行します。

pandoc -f markdown input.md ^
-s -c github.css -t html5 -o output.html

GFM の場合は+yaml_metadata_blockオプションを使います。

pandoc -f markdown_github+yaml_metadata_block ^
input.md -s -c github.css -t html5 ^
-o output.html

実行すると YAML メタデータが流し込まれた HTML ファイルが出力されます。プレースホルダの記述方法は、テンプレートと出力されたHTMLファイルを見比べると分かりやすいです。テンプレートの内容はpandoc -D html5で確認できます。



Pandoc変数

テンプレート内のプレースホルダは Pandoc 変数を使って制御することができます。それではテンプレートと出力されたHTMLファイルを見比べてみましょう。

条件分岐

例えば変数$subtitle$では条件分岐が使われています。

この場合、変数$subtitle$に値がセットされていれば
<h1 class="subtitle">$subtitle$</h1>を適用します。

$if(subtitle)$
  <h1 class="subtitle">$subtitle$</h1>
$endif$

出力結果を見ると、このようになっています。

<h1 class="subtitle">これはサブタイトル</h1>

同様に変数$title$では、変数の値がセットされていない場合
<header>...</header>の行全体が適用されません。

$if(title)$
  <header>
  <h1 class="title">$title$</h1>
  $if(subtitle)$
    <h1 class="subtitle">$subtitle$</h1>
  $endif$
  $for(author)$
    <h2 class="author">$author$</h2>
  $endfor$
  $if(date)$
    <h3 class="date">$date$</h3>
  $endif$
  </header>
$endif$

繰り返し

例えば変数$author$ではリスト形式で複数の値がセットされています。このように変数の値が複数ある場合は$for$キーワードを使って値を取得できます。

この場合変数$author$に値がセットされていれば、
値毎に<h2 class="author">$author$</h2>を適用します。

$for(author)$
  <h2 class="author">$author$</h2>
$endfor$

出力結果を見ると、このようになっています。

<h2 class="author">foo</h2>
<h2 class="author">bar</h2>

このようにテンプレートと YAML メタデータブロックを使えば、柔軟なメタデータの流しこみが可能になります。



まとめ

簡単ですが Pandoc の HTML 変換を紹介しました。Pandoc には他にも多くの機能があります、興味を持った方はユーザーズガイドを読んでみてください。

本家ユーザーズガイド

日本語ユーザーズガイド

参考までに、今回使用したオプションを全てコマンドラインに適用すると こうなります。

pandoc -f markdown_github-hard_line_breaks^
+raw_html+fenced_code_attributes^
+tex_math_dollars+yaml_metadata_block ^
input.md -t html5 ^
--mathjax --template=mytemplate.html ^
-o output.html

付録

この投稿で使用したカスタムテンプレートと css を載せておきます。

mytemplate.html


github.css

2015年2月24日火曜日

TiddlyWikiの検索プラグインをカスタマイズ

この投稿では TiddlyWiki classic (TWc)のプラグインのひとつ 「SimpleSearchPlugin」について書いています。

SimpleSearchPlugin

TiddlyWiki に標準で組み込まれている検索機能は、マッチした tiddler を全て表示するタイプなので検索結果によっては tiddler の洪水になってしまうことがありました。この SimpleSearchPlugin では、そんな心配はありません。

SimpleSearchPlugin は検索結果を「リスト形式」で表示してくれる便利なプラグインです。検索結果リストの tiddler を全て一括して開くこともできますが、選択した tiddler だけを開くことができるのが大きな特長です。マッチした結果リストから、どの tiddler を開くべきなのかは全てユーザーの選択に委ねられています。検索結果は 「ほぼタイトル順」 に表示されます。(「ほぼタイトル順」については後述します)

既に1年ほど、このプラグインを使っていますが、ここ最近の個人的なニーズでは検索結果リストの並び順は時系列のほうが使いやすいように感じています。特にマッチ件数が多い場合はなおさらのことです。そこで今回は検索結果リストの並び順を tiddler の変更日順に修正することにしました。



SimpleSearchPlugin の動作概要

  1. SimpleSearchPlugin は、前半に検索結果を表示する UI と css 部分、後半に標準の検索機能をオーバーライドする関数で構成されています。これによって標準の検索機能は、新しい検索機能に書き換えられます。
  2. TiddlyWiki の検索機能は、標準の組み込みマクロの search ハンドラ がユーザーからの入力を受け取った後、引数に検索文字列と検索オプションをセットして Story.search() を呼び出します。
  3. オーバーライドされた Story.prototype.search() と TiddlyWiki.prototype.search() によって、新しい検索機能で処理された検索結果リストを画面に出力します。


はじめに Story.search() から見ていきます

Story.search() は、引数に検索文字列と検索オプションを受け取り、マッチした結果のリストを画面に表示します。

Story って何?
story オブジェクトは Story クラスのインスタンスです。tiddler の表示全般を受け持つオブジェクトです。

Story.prototype.search = function(text, useCaseSensitive, useRegExp) {}

引数

  • text : (string) 検索文字列。
  • useCaseSensitive : (boolean) 検索で大文字小文字を区別。
  • useRegExp : (boolean) 正規表現で検索。

Story.search() は、検索オプションに従って予め検索文字列を加工してから store.search() に渡します。このとき、ソート項目を指定する引数 sortField は null が設定されています。

    var matches = store.search(highlightHack, null, "excludeSearch");

Story.search() の最後で、マッチした検索結果のリストを displayResults() に渡して画面に表示します。



つづいて store.search() を見ていきます

store.search() は、引数に検索文字列の正規表現オブジェクトと検索オプションを受け取り、マッチした tiddler オブジェクトの配列を返す関数で、このプラグインの主役です。

store って何?
store オブジェクトは TiddlyWiki クラスのインスタンスで、tiddler の作成や削除、保存や更新などの tiddler の操作全般を受け持つオブジェクトです。store オブジェクトの実体は HTML の非表示 DIV 要素です。

TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {}

引数

  • searchRegExp : (string) 検索文字列。
  • sortField : (string) ソート対象のフィールド名( tiddler オブジェクトのプロパティ)を指定。
  • excludeTag : (string) 検索結果から除外するタグ名を指定。
  • match : (boolean) 検索条件にマッチするものを含めるか、又は除外するかを指定。


対象 tiddler を抽出

store.search() は、最初に reverseLookup() を実行しています。このとき実際に渡される引数を整理すると、このようになります。

  var candidates = this.reverseLookup("tags", "excludeSearch", false);

この場合 reverseLookup() は「"tags" フィールドの値が "excludeSearch" にマッチしない」 tiddler を全て検索して、その結果を tiddler オブジェクトの配列で返します。このとき、引数 sortField を指定しない場合は、検索結果をタイトル順にソートして返されます。また、タグ名 "excludeSearch" はスペシャルタグのひとつで、検索結果から除外するタグ名として TiddlyWiki で設定されています。

言い換えると reverseLookup() は「検索除外に設定されていない tiddler 全て」を、タイトル順にソート済みの tiddler オブジェクトの配列で返します。


抽出結果を検索

次の search 部分ではオブジェクト配列の中から、「タイトル名」、「タグ名」、「本文テキスト」の各プロパティの値を検索して、各々の検索結果を収集した後で全てを結合しています。ここでは標準の検索機能に無かった「タグ名」が、新たに検索対象に加えられていることがわかります。

  var results = primary.concat(secondary).concat(tertiary);

検索結果をタイトル順にソート

if(sortField) {
  results.sort(function(a, b) {
    return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
  });
}

最後に、検索結果を格納したオブジェクト配列を Story.search() に返す。


おおまかに、このような流れで処理が行われていることがわかります。

デバッガでコードをトレースしていて分かったのですが、どうやらタイトル順にソートするところで失敗しているようです。 と言うのも、引数の sortField は null で呼び出されているので、
if(sortField) {}if(null) {} となります。
したがってソートが実行されずにそのまま通過しているようです。その結果、「タイトル名」、「タグ名」、「本文のテキスト」のそれぞれの検索結果が存在する場合、検索結果リストは 「それぞれの、タイトル順」 で表示されることになります。

いままで「検索結果の一覧の並び順、なんか変だな?」と感じながら使っていたのですが、ようやく理由が分かった気がします。



検索結果の一覧を、変更日順に修正する

修正箇所がわかったので、ソート部分のコードを少し修正して 「tiddler の変更日順」 にしてみました。合わせて検索結果のリスト表示を修正して、変更日付を表示するようにしました。 tiddler オブジェクトのソートは store.sortTiddlers() を使っています。この関数は与えられた tiddler オブジェクトの配列を、指定した field でソートして返してくれます。


修正箇所は以下のとおりです

  1. displayResults()
    • 変更日を先頭に追加。
  2. TiddlyWiki.prototype.search()
    • 機能していないソート部分のコードをコメントアウト
    • ソート項目を指定する sortField の値を追加。
    • リストの内容を sortTiddlers() を使って並べ替え。

修正部分のコード

displayResults() の変更と追加

  displayResults: function(matches, query) {


    ......................


    if(matches.length > 0) {
      msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
      this.results = [];
      for(var i = 0 ; i < matches.length; i++) {
        this.results.push(matches[i].title);
  // add Date for results list
        msg += "* " + matches[i].modified.formatString("[ YYYY-0MM-0DD ]");
        msg += "  [[" + matches[i].title + "]]\n";
      }
    } else {
      msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
    }


    ......................


    }
  },

TiddlyWiki.prototype.search() の変更と追加

  // override TiddlyWiki.search() to sort by relevance
  TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {


    ......................


    var results = primary.concat(secondary).concat(tertiary);

  // comment out sort function
  //  if(sortField) {
  //    results.sort(function(a, b) {
  //      return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
  //    });
  //  }

  // add sortField, sortTiddlers
    sortField = "-modified";
    this.sortTiddlers(results,sortField);

    return results;
  };


一覧のソート項目や並び順を変更するには

sortField に "-modified" を指定すると、tiddler の変更日の新しい順にソートできます。tiddler の変更日の古い順にソートする場合は、マイナス記号の無い "modified" を指定します。文字の先頭に "-" をつけると降順になります。

他に、tiddler の作成日でソートする場合は "created" を、タイトル順なら "title" を指定できます。



修正済みのプラグイン全体のコード

https://icm7216.github.io/MyTiddlyWiki/#SimpleSearchPluginでも確認できます。



さいごに

TiddlyWiki を使い始めた頃は tiddler?, story?, store? と、良くわからない事がたくさんありましたが、ソースコードを眺めているうちに少しずつ TiddlyWiki World の謎が解けていくのが面白く感じています。TiddlyWiki の中は HTML, CSS, JavaScript で構成されているのでエディタで直接編集することも出来たり、Firefox の開発ツールで 「ごにょごにょ」 すれば、なんとか 「痒いところに手が届く」 のも気に入っている部分です。

2015年1月27日火曜日

TiddlyWikiの「tiddler マクロ」と「テンプレート」の活用法

この投稿では TiddlyWiki classic (TWc)の標準マクロの一つ 「tiddler マクロ」について書いています。

TiddlyWiki には標準でいくつかのマクロが組み込まれています。これらのマクロは TiddlyWiki 記法を使った内部関数の呼び出し機能ともいえます。「新規作成」や「保存」「検索」ボタン、タブ形式の tiddler リストの表示など、コンテンツのいろいろなパーツはこれらのマクロを組み合わせて作られています。



tiddler マクロとは

マクロについては本家のドキュメントの中で簡単な説明が書かれています。
TiddlyWiki | tiddler macro

The tiddler macro allows you to transclude the text of other tidders, or sections of other tiddlers, into your current tiddler.

翻訳すると、「tiddler マクロは、現在の tiddler の中に他の tiddler テキスト、あるいは他の tiddler の一部をトランスクルードできます。」とあります。

はじめてこのマクロを知ったときは、「なるほど、他の tiddler コンテンツを参照する機能なんだ。」という程度の理解でした。 ところが最近、改めて使ってみると意外にも便利なマクロであることがわかりました。ここで少し例を挙げながら紹介したいと思います。



tiddler マクロの機能

tidder Transclusion:

このマクロの基本機能は前述のように tidder のトランスクルージョン機能です。この機能では対象の tiddler タイトル の記述方法によって、トランスクルードするコンテンツの範囲を指定することが可能です。指定できる範囲は、tiddler 全体、セクション、スライスの3種類となっています。


tiddler全体をトランスクルード

書式

<<tiddler TranscludeContent>>

この書式の場合、現在の tiddler コンテンツ中のマクロを記述した位置に、指定した tiddler タイトル (書式例では "TranscludeContent" )のコンテンツ全体を参照表示します。

サンプルとして参照する "TranscludeContent" の内容です。

<!--{{{-->
!sectionHeading
sliceLabel: Lorem ipsum dolor sit amet, consectetur adipisicing elit

|key1:|value1|
|key2|value2|

!sectionHeading2
Hello $1!  Hello $2.
<!--}}}-->

実行結果はこのようになります。

このマクロはコンテンツ全体を参照表示することから、トランスクルード対象のテキスト量が多い場合は画面表示が冗長になりすぎる傾向があります。その場合は、この書式の使用はお勧めできません。代わりの方法として tiddler リンクを記述して、対象の tiddler を別に表示するほうが良いと思います。

TiddlyWiki の実際の使用例では、"WindowTitle" が、このマクロを使い "SiteTitle" と "SiteSubtitle" を参照表示しています。どちらもシンプルなテキスト量の tiddler です。


セクション・トランスクルージョン

書式

<<tiddler [[TranscludeContent##sectionHeading]]>>

セクション・トランスクルージョンはトランスクルードする範囲を 「見出し( Heading )」 を使って指定します。対象範囲として、「見出し」の次の行から始まり、次の「見出し」の直前までのテキストが参照されます。このとき、次の「見出し」が見つからない場合は、テキストの文末までが対象範囲として参照されます。

書式中の「見出し」の指定方法は、tiddler タイトルと「見出し」の間にセクションセパレータ記号##を記述して指定します。参考までに、TiddlyWiki 記法の「見出し」は、"!foo" や "!!bar" のように見出し文字列の先頭に!記号を付加して指定します。

上の書式例でトランスクルードする範囲は、タイトル "TranscludeContent" 内の「見出し」 "sectionHeading" 以降から次の「見出し」 "sectionHeading2" の直前までが参照対象になります。

実行結果はこのようになります


スライス・トランスクルージョン

書式

<<tiddler [[TranscludeContent::sliceLabel]]>>

スライス・トランスクルージョンは {key: valve} ペアに似ています。トランスクルードする対象を 「key:」 を使って指定します。このときの対象範囲は、「key:」 の直後から始まり、行末までのテキストが参照されます。

スライス対象の 「key」 の指定方法は、tiddler タイトルと 「key」 の間にスライスセパレータ記号::を記述して指定します。

例えば、スライス・トランスクルージョン対象のタイトル "TranscludeContent" の中に、下記のように key: valve ペアが記述されている場合。

sliceLabel: Lorem ipsum dolor sit amet, consectetur adipisicing elit

このときトランスクルードする範囲は "TranscludeContent" 内の 「key」 である "sliceLabel:" の直後から始まり、行末までのテキスト (Lorem ipsum dolor sit amet, consectetur adipisicing elit) が参照されます。

実行結果はこのようになります

他にはテーブルを使ったスライスも可能です。この場合テーブルの1列目が 「key:」 になり、2列目が 「value」 になります。また、テーブルの1列目の文字列は、 「key:」 であっても 「key」 であってもどちらでも可能です。

例えばこのようなテーブルです

|key1:|value1|
|key2|value2|

key1 を指定して値を取得してみます。

<<tiddler [[TranscludeContent::key1]]>>

実行結果はこのようになります

この記述の注意点は、テーブル幅を調節するために空白文字を入れると参照に失敗します。

スライス・トランスクルージョンの実際の TiddlyWiki での使用例は、 "ColorPalette" で見ることができます。この中では色名をキーにして、その値が取得できるように記述されています。主に、このような使い方をサポートすることがスライス・トランスクルージョンの使用目的とされています。

"ColorPalette" の中は、このような記述になっています。

Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88


引数付きトランスクルージョン

書式

<<tiddler TranscludeContent with:"param1" "param2">>
<<tiddler [[TranscludeContent##sectionHeading]] with:"param1" "param2">>
<<tiddler [[TranscludeContent::sliceLabel]] with:"param1" "param2">>

トランスクルードを行うときに、与えられた引数をプレースホルダに置換します。使用できるプレースホルダの数は9個までです。

トランスクルード対象のコンテンツ内でプレースホルダの指定は$1,$2, ... ,$9を記述します。このとき、「引数」に与える文字列は英数字a-ZA-Z_0-9でなければなりません。

例えば "TranscludeContent" のコンテンツが下記のように記述されている場合

Hello $1!  Hello $2.

下記の記述で 「引数付きトランスクルージョン」 を行うと

<<tiddler TranscludeContent with:"Ruby" "Python">>

2つの引数がプレースホルダに置き換えられて、このような参照結果になります。

この 「引数付きトランスクルージョン」 と 「テンプレート」 を組み合わせると便利な機能が作れます。次に、いくつかのテンプレートの使用例を紹介します。



テンプレートの使用例

TiddlyWiki の画面構成は HTML で記述されているので、tiddler 内に HTML を直接記述することも可能です。また、記述内容が定型化できる場合は、テンプレートにするとさらに便利になります。

実際の実行画面は icm7216.github.io/MyTiddlyWiki/ - TranscludeSample で確認できます。


Youtube 動画を埋め込む

tiddler マクロを使って、Youtube 動画を埋め込むテンプレート

!youtube
<html>
  <div align="center">
    <iframe width="$1px" height="$2px" src="$3?rel=0" frameborder="0" allowfullscreen></iframe>
  </div>
</html>
!end

マクロ記述 : 引数は、「横」px、「縦」px、「動画URL」を指定します。

<<tiddler [[embed##youtube]] with:"420" "315" "http://www.youtube.com/embed/pWOigTwzj_g">>

実行結果


pdfファイルを埋め込む

tiddler マクロを使って、pdf ファイルを埋め込むテンプレート

!pdf
<html>
  <div align="center">
    <embed width="$1px" height="$2px" src="$3" type="application/pdf" ></embed>
  </div>
</html>
!end

マクロ記述 : 引数は、「横」px、「縦」px、「pdfファイルのURL」を指定します。

<<tiddler [[embed##pdf]] with:"500" "300" "http://www.mozilla.jp/static/docs/press/Mozilla-Firefox_ReviewersGuide-April2014.pdf">>

実行結果

pdf ファイルは Mozilla Japan の 「Firefox レビュアーズガイド (2014年版 / PDF / 英語)」を使用しました。


バーグラフを表示

tiddler マクロを使って、バーグラフを表示を埋め込むテンプレート

!bargraph
<html>
<div style="display: block; width: $2px; border: 1px solid black;">
  <div style="width: $1%; background: none repeat scroll 0% 0% rgb(246, 244, 49);">
    <div style="text-align: left; margin-left: 10px; white-space: nowrap;">
        $1 %
    </div>
  </div>
</div>
</html>
!end

マクロ記述 : 引数は、「パーセント値」%、「横幅」pxを指定します。 この例では、値「20%」横幅「300px」の棒グラフを表示します。

<<tiddler [[embed##bargraph]] with:"20" "300">>

この棒グラフにテーブルを組み合わせると、レイアウトしやすくなります。

OSシェア
|Windows 7|<<tiddler [[embed##bargraph]] with:"56" "300">>|
|Windows XP|<<tiddler [[embed##bargraph]] with:"18" "300">>|
|Windows 8.1|<<tiddler [[embed##bargraph]] with:"9" "300">>|
|Windows 8|<<tiddler [[embed##bargraph]] with:"4" "300">>|

実行結果はこのようになります

実際の使用では、これらのテンプレートを一つの tiddler に纏めて記述しておきます。この例ではタイトル名 "embed" tiddler を作成しています。

タイトル名

embed

コンテンツ

<!--{{{-->

!youtube
<html>
  <div align="center">
    <iframe width="$1px" height="$2px" src="$3?rel=0" frameborder="0" allowfullscreen></iframe>
  </div>
</html>
!end

!pdf
<html>
  <div align="center">
    <embed width="$1px" height="$2px" src="$3" type="application/pdf" ></embed>
  </div>
</html>
!end

!bargraph
<html>
<div style="display: block; width: $2px; border: 1px solid black;">
  <div style="width: $1%; background: none repeat scroll 0% 0% rgb(246, 244, 49);">
    <div style="text-align: left; margin-left: 10px; white-space: nowrap;">
        $1 %
    </div>
  </div>
</div>
</html>
!end

<!--}}}-->

複雑な機能を TiddlyWiki に追加したい場合は、マクロやプラグインを書く必要がありますが。少しばかりの HTML を書くことで実現できる場合は、このような 「tiddlerマクロ」 と 「テンプレート」 を使えば、新しい機能を追加することができます。