niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R)captionerパッケージがArchivedになっていたのでForkしておいた(メモ)

CRANから落ちてしまったらどうしようかねコレ…。

先日、色々見ていたら気づいたのですが、captionerパッケージがArchivedになっていました。

github.com

ので、さっそくFork...

github.com

このパッケージはRMarkdownでWord文書を作ろうのときに使っていたのですが、今後CRANから落ちてしまったら復活の芽がなくなってしまったのでなんとかしたいな…と思って少しずつコード読み中です。

Feel free to fork, copy, use as desired. No attribution necessary.

とあるので、自由に使わせていただくです…。 一応、MITライセンスっぽいですしね…

github.com

(R/OOXML)namespaceがないとw:を入れられない…

という気付きが結構前にあったらしい…

下書きのまま放置していたので、忘れてしまわないうちに書く。

stylexパッケージ、docxのstyleをR上で加工しやすくしようと思って作っていたのですが、docxファイルを記述しているOOXMLは、w:nameのようにw:のnamespaceが与えられています。

xml2パッケージでこのnamespaceつきのタグ、w:nameなどを入れる場合、あらかじめそのnamespaceを定義しているrootを作るなりしないといけないようです(仕様に書いてあるかもしれないけど見つからなかった

例えばこんな感じに。

xml2::xml_new_root(
    "styles",
    "Ignorable"="w14 w15 w16se w16cid w16 w16cex",
    "xmlns:mc"="http://schemas.openxmlformats.org/markup-compatibility/2006",
    "xmlns:r"="http://schemas.openxmlformats.org/officeDocument/2006/relationships",
    "xmlns:w"="http://schemas.openxmlformats.org/wordprocessingml/2006/main",
    "xmlns:w14"="http://schemas.microsoft.com/office/word/2010/wordml",
    "xmlns:w15"="http://schemas.microsoft.com/office/word/2012/wordml",
    "xmlns:w16cex"="http://schemas.microsoft.com/office/word/2018/wordml/cex",
    "xmlns:w16cid"="http://schemas.microsoft.com/office/word/2016/wordml/cid",
    "xmlns:w16"="http://schemas.microsoft.com/office/word/2018/wordml",
    "xmlns:w16se"="http://schemas.microsoft.com/office/word/2015/wordml/symex"
  )

これは実際にPandocで生成したdocxをxml2パッケージで読み込んだ際に含まれていたものを列挙しているだけです。これを、stylexパッケージ中でも使うようにしました。

github.com

コード内に定数を書いている状態なので、新しいPandocが出てきたときなどに更新が入った場合、それに追従しないといけないというデメリットはありますが、現時点でどうなるかわからんものはとりあえず動くことを重視…(毎回Pandocを起動して、docxからnamespaceを抽出して…とやってもいいものの、そこまでする…?という…)

いないと思いますが、R上で同様のことをしようとして詰まった人のために書き残しておきます。

(R)Localeを英語設定に変更すると日本語を扱うとabortするので注意…(メモ)

考えてみれば当たり前なんだけども…

こちらの記事とまったく同じモチベーションで、エラーメッセージを英語にして報告したいな、と。

dichika.hateblo.jp

で、これを設定すると以降は英語でエラーメッセージが出てきて便利。

Sys.setlocale("LC_CTYPE","English")

しかし、ここで日本語ファイル名で保存するコードとかを書くとRがabortします。何度かやらかしてつらい気持ちになったのでメモとして。

localeについてはこちらにもまとまっていたのでこちらも見ると良いカモ…。ややこしいわね…。

notchained.hatenablog.com

が、よくよく考えるとエラーレポートの時はreprexパッケージ使うよねってのと、そのとき英語設定になるのでこの設定をユーザがわざわざやる必要はないかな、という結論になりました(結論を先に書け)

notchained.hatenablog.com

(Pandoc)PandocのシンタックスハイライトはWriter依存

読み解くの大変っす…。

Pandocのシンタックスハイライトはskylightingが担っています。これはPandoc内に埋め込まれているので、フィルタ等で制御できる奴ではないです。

github.com

で、Pandocは特定の出力形式にのみハイライト対応しています。

Currently highlighting is supported only for HTML, EPUB, Docx, Ms, and LaTeX/PDF output. 

とのこと。

pandoc.org

ODTについて対応していないことは日記にも書きました。

niszet.hatenablog.com

これは結局どういうことか?というと、掲題のとおりPandocのWriter内で対応する処理が書かれているかどうか?に依存します。対応する文字トークンに対してスタイルを生成してドキュメント内に納める、といったことをする必要があります。

Docx.hsではここ(styleToOpenXml)で処理しています。

github.com

これをODTにも移植すればいいはずなので、検討中です。

でもまぁコードを読んでいると、

where alltoktypes = enumFromTo KeywordTok NormalTok

とかあるわけです。このTok系はSkylighting内で定義されていて、Styles.hsの中にいます。

github.com

コレら、依存しているモジュールを読み解かないといけないので大変…。と言っても最低限で良いし、HackageとかVSCode上のHaskell拡張によってどのモジュールなのか、定義はどうなのかがわかるのでそれほどではないんですけどね。順を追ってやれば理解できるのではないかなと思っていますが…。

ドキュメントを書き出す場合、書き出す順序が重要なので普通のプログラムとあまり見た目で変わりなく(そうか?)、処理がそれぞれ関数化されているなぁ…で見ていけば良いので、対応関係を取ることが比較的やりやすいのではと思います。

みんなもPandocのWriterのコード読んでcontributeしようよ(私はまだしていないけど。

LibreOfficeのスタイルに関係する資料が分かりやすそうなので収集中…(メモ)

先人に感謝…

ODT形式について調べていると、Wordのそれに比べるとすべてがスタイルで作られている、という設計思想が垣間見えるのでLibreOffice関係でスタイル関係の資料がないか検索したところ、いくつか良い資料が見つかったのでここにまとめておきます。困ったらこれ読んだらいいんじゃないかな?と、今後はとりあえず伝えればよいかな…。

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

これの、Pandocで活用するためには…版を作りたいですねぇ(作りたいという気持ちを表明するだけ…

(Pandoc)ODT形式での出力はraw記法もフォローしているのでやりたいことが大体出来る

ODT出力の場合に出来ることがどこまであるかを全部チェックしていく

他のファイル形式の出力と同様に、PandocでODT形式で出力する場合にも、generic-raw-attributeを使用して出力ファイルに直接文字列を埋め込むようなことが可能です。これは対象のファイルに直接埋め込まれるため、出力ファイル形式の文法的に正しいものでなくてはいけません。

pandoc.org

例えば以下のコードを(行頭のバックスラッシュは、はてな上でbacktick x3を入れるための苦肉の策。コピペするときは取り除いてください)埋め込むことで、任意の位置にAuthorスタイルが適用された"Author"という文字列を埋め込むことが出来ます。

\```{=opendocument}
<text:p text:style-name="Author">Author</text:p>
\```

例として上記のコードを書きましたが、実際に使用する場合は所望の箇所に必ず同じ書式で書かれて欲しいということが多いと思いますので、テンプレートかreference.odtのどちらかを使用する方が良いでしょう。

raw記法は何でも出力できてしまうので、ゴミデータを入れると出力ファイルが破損して開けないということもあるので注意しましょう。出力先のファイル形式の文法的に正しいもの以外が入っている場合の挙動はアプリケーション依存となります。使用の際は出力するファイル形式の文法仕様をしっかり確認しましょう。

MS WordやLibreOfficeWriterは破損したドキュメントもある程度読んでくれますが(特にMS Wordはそうです)、意図したように復元されるとは限らないですし、エラーのないデータが生成できるようにしましょう。

ODT形式の場合、文法の詳細は最新のODF1.3の仕様を確認してください。

しかし、Pandocは現時点ではODFのバージョン1.2として出力しているので、1.3と1.2の更新部分に相当する記述を埋め込むと意図しない結果になるかもしれませんので注意が必要かもしれません(未調査です…)

ODF1.3についてはこの記事などを見ると良いかもです(ドキュメントへのリンクもあって便利…)

ja.blog.documentfoundation.org

ということで、ODT形式でもraw記法が使用可能なので、body部分に埋め込めるタグであればカスタマイズが容易に出来そうですね。

(Pandoc)PandocのODT出力はシンタックスハイライト未対応

マニュアルに書いてあるけど実際やってみてダメなのを確認。

docx出力では出来るがODT出力ではできないことのひとつに、シンタックスハイライトの対応があります。ODT出力では未対応。

マニュアルのシンタックスハイライトの箇所、

pandoc.org

より引用。対応する形式は下記の通り。

 Currently highlighting is supported only for HTML, EPUB, Docx, Ms, and LaTeX/PDF output. 

実際にPandoc 2.10.1 で確認しましたが未対応でした。

ODT文書を解凍し、内部のcontent.xmlの中も確認しましたが、タグも埋め込まれていないのでODTのテンプレートのスタイルが対応していないというレベルではなく、ファイルとしてハイライト用の情報が入っていないということになりますね。つまり外部のファイルをいじって対応はできない、という事です。

OSTファイルのスタイルが対応していないだけであれば、テンプレート側をいじれば対応も可能となるのですが…。

とりあえず、現状はそうだということで。いずれは対応するかもしれませんね(需要次第でしょう)