2019年5月28日火曜日

エディタから latexmk を使うと何故か pdflatex を呼び出される

去年ほぼ同じ内容をまとめていたので要約

Q: エディタの拡張機能とかで latexmk を使ってコンパイルすると、latexmkrc の記述を無視して pdflatex が使われてしまうのは何故?
A: (1) エディタが付加している latexmk のオプションに -pdf が含まれていたから (2) latexmkrc の問題(正しく読み込まれていない、実はうっかり別のファイルで $pdf_mode やオプションを指定してしまっていた、など)
Q: 作業ディレクトリをカレントディレクトリとして動作させたシェル(cmd, PowerShellなど含む)で latexmk を実行したらうまくいくのに、エディタの拡張機能とかで latexmk を使ってコンパイルすると失敗するのは何故?
A: ディレクトリのパスやファイル名に、漢字や空白文字が含まれていたり、ネットワークパス(Windowsの場合)だったりするとうまくいかないときがあります。

Visual Studio Code + LaTeX Workshop ではまっていたのです

texファイルのホームディレクトリに latexmkrc を作って、

$pdf_mode = 3;
$latex = 'platex -synctex=1 -halt-on-error %O %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$bibtex = 'pbibtex %O %B';
$max_repeat = 5;

とか書いておけば、 platex と dvipdfmx を使って良い感じに仕上げてくれるはず、なのですが、 vscode と latex拡張の組み合わせでは、何故かpdflatex が実行されてしまいます。何故? latexmkrc が読まれてないのか? と思ったのですが、 理由は package.json で設定されている latex-workshop.latex.tools にありました。
https://github.com/James-Yu/LaTeX-Workshop/blob/v7.0.1/package.json
            {
              "name": "latexmk",
              "command": "latexmk",
              "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "-outdir=%OUTDIR%",
                "%DOC%"
              ],
              "env": {

              }
            },
そこに-pdfが書いてあるせいです。これを書かれてしまうと latexmkrc が $pdf_mode を指定しても無視するんですよね…勘弁してほしいなあ…

(2021年12月追記:最近では "latexmk(latexmkrc)"というものが追加されており、argsに何も設定されていないモードが追加されていましたので、これを使うとよいでしょう。)  

対策は、latexmk のツールの設定を上書きし、 -pdf オプションを外すことです。
ファイル→基本設定→設定、を選び、latex-workshop.latex.tools を検索し、settings.json をクリックします。
表示されるjsonファイルに "latex-workshop.latex.tools" 要素を入れてしまいましょう。 補完入力に乗っかると全部書かれてしまいますが、latexmk の args(引数)に該当する部分をよく見て、
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        }
    ]
などとすればよいでしょう。

2019年5月13日月曜日

e2ps の修正パッチを一段落させた

 Linux などで日本語テキストファイルをPostScript形式に変換するソフトウェアの一つに e2ps があるのですが、いろいろバグが多くて困っており、一昨年くらいからちまちまと直したりしていました。
http://taraijpn.blogspot.com/2017/06/e2pspatch.html

 とりあえず Debian BTS で公開されているバグを直すところまで出来たので改めて紹介します。修正点は以下の通り。
  • フォントリストの文字型配列がコンパイル不能な書き方だった点を修正。
    • 各ディストリビューションで対応されています。
  • 用紙サイズのポイント数を PostScript の仕様で使われている数に合わせて修正。
    • 一部ディストリビューションで対応されています。
  • 生成される PostScript が EPS だった問題などを修正。
    • これでようやく fixps に怒られずに済みます。
  • 出力したページ数が誤っていた問題を修正。
    • ja_JP.EUC-JP 環境以外で動いているときに起こる問題でした。
  • ヌル文字から始まるテキストファイルが与えられるとクラッシュする問題を修正。
    • これは  https://bugs.debian.org/715852 で報告されていたものです。ヌル文字しかない、もしくはヌル文字から始まる(という意地の悪い)テキストファイルを印刷しようとすると起こる問題です。
  • 複数のファイルをまとめて変換すると、他のファイルの印刷末尾に余計な文字列が含まれる問題を修正。malloc を全て calloc に書き換えた。
    • e2ps README.euc README.english などとして出来たファイルを見たとき気づきました。環境依存?
  • Letterサイズで2面付け(-p2, -l2)を行うと用紙をオーバーする問題を修正。
    • 用紙のアスペクト比を維持するか、アスペクト比を歪めて紙面を広く使うか、どちらか悩んだ結果、前者を取りました。本来であればマージンを調整すべきところなのですが、それは全ての用紙サイズで考えないといけないことなので棚上げ。
  • PostScript の作者 ( %%Creator: ) は e2ps であるものとした。
    • CREATOR は help で使ってたので手を入れました。

 以上の内容を、patch1 として公開しました。(2019/5/14 patch1タグを打ってあります。
https://gist.githubusercontent.com/taraijpn/ea10ff9e908befafab7cff719f26dd20/raw/9a4a6fd502958a0e87db364174cbc331d07055be/e2ps-4.34.patch


 実はもう少しやらないといけないことがあって、
  • 変数の型を整理する。
    • unsigned char を使わないようにする。そもそも string.h で読んでいる関数と合わず warning が出ます。
    • unsigned char や signed char といった型は使わないようにして、コンパイラの警告をなくす。
  • 読み込めるファイルサイズを制限する。(2GB程度の予定)
    • unsigned long を size_t に直したらえらいことになったので。
 機械的な置き換えで問題ないかと思ったのですが、そんなに甘くなかった。sjisの変換に失敗する、とか、READMEにある他アーキテクチャ対応に悪影響が及びそうな気がするので、ちょっと止めてあります。とりあえず patch1 の上流での採用を目指したいところ。

 なお上流への連絡は、WebページにあるCGIで掲示板への書き込みやメールの送信を試みましたがいずれもエラーで動かず、2015年に公開されていたWindowsのプログラムにあるreadmeにメールアドレスが掲載されていたので、そこに送っています。果たして無事届いていますでしょうか……

bloggerにログイン出来なかった…

しばらく使っていなかったのですが、一般ユーザー向けgoogle+との兼ね合いかなにかで、2019年4月以降、 bloggerへのログインがうまくいかない場合が起こるようです。

ログインをクリックして自分のgoogleアカウントを選択しても、
https://www.blogger.com/about/?hl=ja
何度もこのログインページに戻される、という状況。

で、解決方法が以下。
https://support.google.com/blogger/thread/3471576?hl=en

ブラウザから google のサービスにログインしている状態で、
https://www.blogger.com/switch-profile.g
にアクセスし、blogger用のプロフィール(要は名前?)を付けなおすことで、自分のblogger投稿ページに進むことが出来、それ以降は自分のbloggerページからログインすることが出来るようになってます。

意外と見つからなかった…