niszetの日記

細かい情報を載せていくブログ

(Word/ooxml) customStyleでないスタイルはWordの保存時にStyleIdが変更される(メモ)

これはおそらくWordの仕様

PandocのWordのテンプレートファイルを調べています。

Pandocが生成する、reference.docxには何点か注意しないといけない点があり、そのうちのひとつがStyleIdがWord文書保存時に変更されてしまう、というものです。これはそのスタイルがcustomStyleでない場合にのみ起こり、保存前にそのスタイル名を変更しておいてもStyleIdは変更されました(スタイル名は保持される)

Pandocで長らくIssueになっていて去年後半で解決した件の元になるのはこのWordの仕様によるものでした。もともとStyleIdは英数字のみのようなので、eastAsia勢にとっては優しくないのですが…。

OOXMLではなくWordの挙動としてどうなのかを見ないといけないのはちょっと大変ですね…。

とはいえ、長らく気になっていた挙動が確認できたので満足…。styleの参照関係を見るときはちょっと工夫が必要そうですね…。

補足

(R) xml2::xml_structure() が便利だった

コミケが終わったので技術書典に向けて走り始めます。

次回は無謀にもWordのスタイルの話をしたいと考えていますが、そのためにはまずWordをxmlに分解してその中身を見ていかねばなりません。

私が一番手馴れているのがR言語なので、xml2パッケージを使ってサクッとみていこう…と思ったのが読みの甘さ。XMLの構造は厄介ですね…(それでもR言語xml2パッケージのおかげでかなり楽に見れていると思いますが)

深さも項目も不明。。。

OOXMLの仕様を完全に理解しているわけではないので、スタイルを指定しているxmlファイルの構造がわかっていません。基本的にはxml_children()lengthが非0であれば子要素がいるということで探索すればよいのですが、タグが存在するだけで意味をなすもの、attrを与えることで意味があるものとあり、attrのkeyも要素ごとに異なります。まぁvalだけ見ておけばいいかなって結論になりつつありますが…。

そんなとき、ひとまず構造だけ押さえておきたいという場合は、xml2::xml_structure()を使うと良いです。

f:id:niszet:20200101232142p:plain

これはとあるWordファイルからstyle.xmlを抜き出し、その中のstyleタグでtypeがparagraphのものだけを選択してからxml_structureに与えたものです。注意すべきは、これはcatと同じく標準出力に文字を吐き出す関数になっているので、これの返り値を変数に代入して使うということはできません。その代わり、for文の中においてもそのまま使える点は便利です。おそらくそういう使い方を想定しているのかな、と。インデントで要素の親子関係を示していて、[]でattrを示しています。

で、これで構造をある程度抑えておいて、処理を書けば見通しが良くなるのではと思います。まぁ実際は処理中にチェック入れておかないと、typoとかあると抜けるので何とも…って感じがしますが。

tibbleを使えば、dataframe中にdataframeを持つような構成ができますが、今回は人間が見てわかる表を作りたかったのでやっていません。が、処理の途中のデータの持ち方としてはその方が良かったのかなぁ…という気もしますが。

そんな中、作っている表が次のようなもの。

f:id:niszet:20200101232701p:plain

これは、Pandocが生成するテンプレートファイル中に存在するスタイルの情報をまとめようとした表です。ひとまずこのレベルまでは作れましたが、この下の階層を見るべきなのかを思案中(多分見ない)

完成したら別の記事にまとめるかもしれません。この記事としては、xml_structureが便利だという記録を残すことが目的なので。

久々のRの記事でした。今年はRも触っていきたいですね(すっかり忘れてしまいました)

では今年も、Enjoy!!

補足

xml2ライブラリのxml_structure()関数に関するマニュアルはこちら。helpでも同じものが見れますが。

xml2.r-lib.org

コミケット97(C97)にサークル niszet工房として参加してきました。

参加し終わったら記録のために日記を書こう。

ということで、コミケとしては私の初のサークル参加となるコミケット97(C97)が無事に終わりましたので、記録のための日記を書きます。2019年もこれでおしまいですが、おおむね良い終わり方を迎えられたのではと思います。

持ち込み部数等。

R MarkdownでWord文書を作ろう、R MarkdownでPower Point Presentationを作ろうはそれぞれ15部、新刊のPandoc関連技術同人合同誌 ぱんどっく C97は25部持ち込み、いずれもコミケとしては新刊なので1部ずつ見本誌を提出しているので、14、14、24部の持ち込みとなります。

最終的には15時の時点でWord本が売り切れて15:30の時点ではサークルとしては撤収をしてしまいました。この時間に来ていた抱いた方がいたらすみません…。結果として残部数が0, 3, 3なので、14部、11部、21部が人々の手に渡ったということになります。達者で暮らせ?よ…

配置場所

南34にいたのですが、南は人権と言われるだけあってかなり暖かく、最後のギリギリまでコート類は脱いでも全然問題ありませんでした。一方で、ホール内の肉のお店のにおいがかなり充満しがちで、それが(空腹に対して)厳しかったですね。序盤の、シャッターが空く前まではかなり充満していました。まぁ、悪いにおいというわけでもないので良いのですが…。

天気

今日は関東で20C!?という記録的な暖かい日だったものの、夕方、撤収時には気温が下がりつつあり、特に強い強風のため肌寒く感じました。とはいえ、カイロが必要というわけでもなかったので、過ごしやすい回だったと思いますが。あと前日は雨だったけど今日は晴れだったので、荷物が濡れる心配などなくて良かったですね。

荷物について

搬入の仕方は考えないとナァ…。今まで旅行用のキャリーを使っていましたが、やはり段ボール用のキャリー使って持って行くのが正解な気がします。あと私が持ってるのはストッパーがないので電車内で固定が出来ないってのも難点…。配達も視野に入れるべきかもしれませんが、前評判通り、コミケでは技術書典のような売れ方はしないので、持って行けるだけ持って行く、というスタンスで良いのかもしれませんが。というか、多分それで良いです。

接客

接客というか、私はあまり呼び込みをしないのです。というのも、Pandocの本、ふらっと立ち寄って興味を持つような本ではないので、ある程度目当てがあってくる、ということを想定しています。なので、当日の浮動票的な購入をあまり期待していないというのがあります。まぁアピールした方が良いと思うのですが、体力的に難しいってのはあります。その代わり?興味を持ったような雰囲気を感じたらめっちゃ説明しました。迷惑だったかもしれないけど…。この辺り、ようやく自分の中で説明の仕方がまとまってきた感じがあるので、それを踏まえて何かしたい気持ちがありますね。

ご近所さん。

今回のお隣さんはアニメの制作関係の本とExcel VBAの本の方でした。それぞれ、その道専門の人が多く買って行ったり、道行く人でVBAという文字で反応した人が手に取ってみたりとそれぞれ対照的でした。どちらとも色々話せて私は満足です。VBAの方は昼前に完売していたので、広い範囲にあたるとコミケでも数がかなり出るんだなぁ…と思いました。

ワンオペはツライ…

途中ちょっと中抜けして付近を回りましたが、あまり長時間離れるのもあれかなーと思ったのであまり離れていません(本当か?) あと、その時に西に行けばよかったですね…かなり、近かった…。そこら辺の下調べが足りませんでしたね。

初参加だとチケットをどうすれば…?で一旦あせる。

今回初参加だったので、サークル入場券の使い方がわかってませんでした。あれは切り離しておくものなのですね。緑の方を出すのかー、と。案内の人に聞いたら優しく教えてくれました。ありがたや。 そして、見本誌の提出をするのですが、そのシールが見つからず、新しくもらいました。見本誌提出することはわかっていたんですが、そういえばシール貼るってことをすっかり忘れていて、それを覚えていればもうちょっとスムーズだったのではと。 まぁ当日その場で書きこんで出せたので特に問題はないのですが。

しゃべりすぎると酸欠になって何言ってるのかわからなくなる問題。

そのまんま。今回は良くしゃべったなぁ。まわりにうるさかったかもしれないんだけど、自分の声はあまり通らないので結構頑張らないと聞こえないというのが課題ですね…。いや解決しなそうなんだけど。

戦利品

あまり時間ない中で、目についたものは買ってきました。が、全然回れてない…!というのを後から気づいています。後で行くって言っていたのに…みたいな方々、すみません…。また、イベントでお会いしましょうね… なお戦利品、いつ読めるかは不明です。

同窓会だよね

って何度か口走っていましたが、イベントのたびに会えるので、半ば同窓会のこころもちです。もちろん、あたらしくPandocを布教してくってのも目的なのですが。あくまでも、Pandocを理解してそれを使いこなして情報発信してくれる人が増えていくのが目的(そして私はそれの情報をおこぼれとしてもらう)なので、そちらも怠りませんが!

良いお年を!

そんなわけでとりとめもなくなってきたのでこの辺で。次は技術書典、Wordのスタイルの話を書ければよいなと思っています。Pandocに関係する話なら合同誌としてはオッケーなので、合同誌というテイで次回も出そうかなと思っています。でも50ページ超えたら流石に単独の本でいいかもしれない。

というわけで、今年も一年お世話になりました。来年もよろしくお願いいたします。

C97にniszet工房として初のサークル参加します

準備が万全とは言えない気がする。

ここ最近本当に色々精神的に余裕がナイ中、それでも一応は形にできたので良かったのですが、今回は(も?)消化不良な感じです。

おしながきツイートはこちら。

買ってくれるとにすぜっとのやる気がupします。買ってくれなくてもPandocの記事がネットに出てくればそれはそれでよいので、是非書いてほしいです。

なお、合同誌と書いていますが書いているのは私だけです。複数人だと思った?残念、にすぜっとちゃんだけだよ!

別にn=1の合同誌がダメってことはないはず…。

Pandocに関連する話題ならwelcomeです。次回は技術書典ですが、Wordのスタイルに関する話をすると思います。なお、原稿はWord形式でお願いしますね。

不完全なままでも歩みを進めていくしかないんだよな…ということで、やっていきます。2019年最後のイベント。頑張ろう。

ペーパードライバー講習(5回分)を終えた

日曜に五時間目の実習を終えました。

いやー、AT車ってギア変えなくて良いので運転楽で良いですねぇ…。

ということで、5時間の実習を終え、無事にペーパードライバー講習を終えたのでした。

実際に車道に出てみると、世の中は危険がいっぱいだし、とても怖い運転(煽り運転とかではなく、ウィンカーも出さずに曲がるとかね)が多いもんだなぁと思ったのでした。

私は必要に迫られて運転慣れする必要が出てきたのですが、出来ることなら運転せずに過ごしたいものです…。

とはいえ、また運転しないと勘がにぶってしまうので、年明けにでも運転する機会を作ろう…。

ということで、少しずつ今年を振り返っているのでした。年内は30日までお仕事、31日はコミケ、1日は休みで2日からお仕事再開です。頑張っていきましょう💪

(Pandoc) Raw記法で各フォーマットが受け付けるFORMATの文字列

穴埋め記事だよ?

この記事は Pandoc Advent Calendar 2019 の3日目が空いているので小ネタを入れていこうというつもりで作った記事ですが、22日、本日も空いているので22日に入れることにしました。

Pandoc Advent Calendar 2019 はこちらから行けます。

adventar.org

過不足と条件付きが結構あるので注意。

さて、本題。Pandoc's Native ASTにはRawInlineRawBlockという要素があり、これらは出力ファイル形式の文法で書かれたコードをそのまま出力ファイルに埋め込むことが出来る便利な要素です。出力ファイル形式以外だと内容は無視されるので、docxように書いたコードとhtml用に書いたコードを入れておいても大丈夫…のはずです。Markdownの記法はマニュアルを読んで欲しいですが、Codeのようにバッククォートで囲った文字列の直後に{=FORMAT}の形で置きます。

pandoc.org

…なのですが、docxで出力するときはopenxmlを要求されるなど、正直言って自明ではありません。そしてマニュアルにも記載がありません。仕方がないのでWriterのコードを読んでそれらしき記述を抜き出しました。PandocのWriterって書き方が統一されていないので単純にgrepで持ってこれるものではなくて目視grepとなりました。

そのため、抜け漏れがあるかもしれません。あと、過剰なのもあるかも。

また、いくつかのファイル形式ではraw_htmlraw_texの拡張が必要な場合があります。また、それらの動作が完全に一致するかという問題もあります(すべて未検証)。TeXやHTMLの仲間ではなく、自身のフォーマット名と異なるものは要注意です。

また、とあるファイル形式ではRawBlockRawInlineのどちらかのみが存在、というのもありました(失念)

さらに、ファイル形式によってはRaw記法がないものがあります。

また、表中ではファイル形式名(-tで指定するもの)ではなく、Writerのファイル名となっています。tidyな表じゃないですが、ご容赦を。

Writer format1 format2 format3 format4 format5 format6
AsciiDoc.hs asciidoc
CommonMark.hs html latex tex markdown
ConTeXt.hs context tex
Docbook.hs docbook html
Docx.hs openxml
DokuWiki.hs dokuwiki html
EPUB.hs html
FB2.hs fb2
HTML.hs html latex tex html5 html4
Haddock.hs haddock
ICML.hs icml
Ipynb.hs html revealjs latex markdown rst ipynb
JATS.hs jats
Jira.hs jira
LaTeX.hs latex tex beamer
Man.hs man
Markdown.hs markdown html html5 html4 latex tex
MediaWiki.hs mediawiki html
Ms.hs ms
Muse.hs
Native.hs
ODT.hs opendocument
Org.hs latex tex org html
Powerpoint.hs openxml
RST.hs rst tex latex
RTF.hs rtf
Roff.hs
TEI.hs tei
Texinfo.hs texinfo tex latex
Textile.hs html textile latex tex
XWiki.hs xwiki
ZimWiki.hs zimwiki html

いずれちゃんと情報整備したいですが、ひとまず公開します。

(Pandoc) Pandoc DiscussメーリングリストでPandocの情報を仕入れよう

この記事は Pandoc Advent Calendar 2019 14日目の記事です。

なお、Pandoc Advent Calendar 2019 のリンクはこちらです。

adventar.org

さて、Pandocはそうこうしている間に2.9がリリースされ、更新速度が保たれたまま機能の追加やバグフィクスが頻繁に行われています。

最新の情報を見続けるならば、PandocのリポジトリWatchしてすべての通知を受け取るという方法がありますが、これをするとメールボックスがPandocの通知で埋まってしまい、結局追いかけることが出来ないという問題があります。というか、なりました。毎日、下手すると何十通も届いてしまうので、適当にフィルタリングしないといけません。

また、Issueについて見てみても、Pandocについて深い理解がないとわからないものも沢山あります。初心者には割と厳しい…。

そこで、おすすめなのがPandoc Discussのメーリングリスト

https://groups.google.com/forum/#!forum/pandoc-discuss

を見るという方法です。

PandocのHelpのページ https://pandoc.org/help.html にもあるように、Pandocに関する質問やおかしな挙動があった場合にはまずここに言って欲しいとなっています。

The first place to go if you have a question about pandoc, or if something doesn’t seem to be working properly, is the pandoc-discuss mailing list on Google Groups.

最近は機械翻訳でもそれなりに読める文章になるので、ここで出てきた質問を翻訳して読んでみたり、(これは英語でないとダメですが)自分の疑問を投げてみると良いと思います。実際に私もLuaフィルタに関する質問に回答した 1 り、疑問点を投げたりしていました。

Pandocの素の機能ではできないことをLuaフィルタで解決したい人が一定数いるため、Luaフィルタのお題が欲しい人にも好いかと思います(いるのか?)

また、英語ではちょっと無理…であれば、日本Pandocユーザー会のSlackで聞いてみるのも良いかもしれません。なんというか…過疎ってはいますが…。Slackへのリンクは下記のHPからたどれます。

pandoc-doc-ja.readthedocs.io

情報収集は大事なので、まずは覗いてみてもらえればと思います。

緩い記事ですが、Pandoc Discussについてもあまり日本語での情報がないので、紹介でした。