アクセント文字を含むPDFのしおりに不具合

アクセント文字を含むPDFのしおりに不具合

- Toshio Otaguro の投稿
返信数: 14
下記のソースでuplatex(TeXLive2016)を走らせると,アクセント文字に関して大量のエラーが報告されます.

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true]{hyperref}
\usepackage{pxjahyper}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\begin{document}
\section{G\"odelの不確定性原理}
なんたらかんたら
\section{\'Etudes et Productions Schlumberger}
Sample
\end{document}

先頭行に
\RequirePackage[2016/03/31]{platexrelease} % tentative remedy
を付加するとこのエラーは解消されます.これはuplatexのバグなのか,hyperrefのバグなのか,はたまたdvipdfmxのバグなのか?どなたかご教示願えないでしょうか?
Toshio Otaguro への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Akira Kakuto の投稿
このような場合は,通常次のようにしていました:

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true]{hyperref}
\usepackage{pxjahyper}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\begin{document}
\section{\texorpdfstring{G\"odelの不確定性原理}{Goedelの不確定性原理}}
なんたらかんたら
\section{\texorpdfstring{\'Etudes et Productions Schlumberger}{Etudes et Productions Schlumberger}}
Sample
\end{document}
Akira Kakuto への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Akira Kakuto の投稿
uplatex なら, pdf string 部分に直接 Unicode 文字を入れて
以下のようにするほうが良いでしょう:

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true]{hyperref}
\usepackage{pxjahyper}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\begin{document}
\section{\texorpdfstring{G\"odelの不確定性原理}{Gödelの不確定性原理}}
なんたらかんたら
\section{\texorpdfstring{\'Etudes et Productions Schlumberger}{Études et Productions Schlumberger}}
Sample
\end{document}
Akira Kakuto への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Toshio Otaguro の投稿
Akira Kakuto 様,

早速ご回答頂きありがとうございました.なるほど,確かにうまく行きますね.早速このやり方を取り入れたいと思います.

残る疑問は,TeXLive2015ではうまく行ったのに,TeXLive2016ではなぜうまく行かなくなったのか?です.

本論とは無関係な訂正ですが,「Gödelの不確定性原理」ではなくて,「Gödelの不完全性定理」とすべきでした.失礼しました.

Toshio Otaguro への返信

Re: アクセント文字を含むPDFのしおりに不具合

- aminophen の投稿
2016 でうまくいかなくなったのは forum:1934 の下の方にコメントしたとおり
「コミュニティ版 pLaTeX / upLaTeX にはアクセント文字についてエンバグが入って
しまった」からです。(文字を合成するコマンドの内部処理を変更したため。)
6 月 19 日に出した「2016/06/10 patch level 1」なら治っていると私は期待して
いますので、更新なさってください。
aminophen への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Toshio Otaguro の投稿
アセト アミノフェンさん,こんにちは,

それが直っていないのでこちらで質問させていただいた次第です.私も forum:1934 のやりとりは知っており,直ることを期待していました.

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `\z@' on input line 13.

というような警告がたくさん出ます.念のため,uplatex のバージョンは,

This is e-upTeX, Version 3.14159265-p3.7-u1.21-160201-2.6 (utf8.uptex) (TeX Live 2016) (preloaded format=uplatex)
restricted \write18 enabled.
entering extended mode
(./test1.tex
pLaTeX2e <2016/06/10u01>+1 (based on LaTeX2e <2016/03/31> patch level 1)

と表示されるものです.これは最新版だと思いますがいかがでしょうか?
Toshio Otaguro への返信

Re: アクセント文字を含むPDFのしおりに不具合

- aminophen の投稿
すみません。エラーとおっしゃっていましたので、もしかして古い版をお使いかなと
勘違いしました。Toshio Otaguro さんのものは最新版です。

「エラーが出てそもそもコンパイルできない」ではなく、警告が出るようになって
しまったわけですね。調べてみます。
aminophen への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Toshio Otaguro の投稿
すみません,私の報告の仕方がまずかったですね.エラーではなくて警告です.よろしくお願いいたします.
Toshio Otaguro への返信

Re: アクセント文字を含むPDFのしおりに不具合

- aminophen の投稿
いえ、こちらも最新版 (2016/06/10 patch level 1) だけでコンパイルしてみて
エラーが出なかったので、その前の版を試すことや警告のチェックを怠っていました。

\documentclass[uplatex]{jsarticle}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[dvipdfmx]{hyperref}
\usepackage{pxjahyper}
\begin{document}

\section{G\"odelの不完全性定理}

\end{document}

これを試すと、2016/03/31 のものだと PDF しおりの文字列が「Gödelの不完全性定理」
ですが、コミュニティ版だと警告が出たうえで「Gö=delの不完全性定理」となっていますね。

警告がどこからどこまで出るかというと

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\begingroup' on input line 9.

から

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\endgroup' on input line 9.

なのですが、予想していたとおり \begingroup ... \endgroup という「完全展開できない
マクロ」の部分でした。「なんで『=』が出るか」は多分 \@text@composite@x の中の
\begingroup ... \endgroup に登場する「=」で、具体的には

    \ifnum\@tempcntb<\z@
      % 中略(\@tempdima に補正すべきシフト量を格納)
      \@tempcntb=\@cclvi
    \else\@tempdima=\z@ % ← ここの「=」
    \fi

の「=」です。とはいえ、ここだけ対処するというのも変だし…

そういう仕様と言ってしまうのも一つの手かもしれません。
しおりに制御綴が絡む場合には角藤さんが既に書いてくださっているとおり \texorpdfstring
を使うのが無難な方法ですし、この方法は私もおすすめします。

# 「<」を書いてしまって途中から消えちゃったので再投稿 :(
aminophen への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Toshio Otaguro の投稿
迅速にご回答いただき,大変有難うございました.途中のマクロの部分は私にはちんぷんかんぷんなので放り投げていたのですが,原因らしきものがわかってよかったと思います.

今後はお勧めのように,角藤さんが書いてくださった方法を使うことにします.

私がTeXを使い始めたのは,TeX78をVAX-11/VMS上で使って感動したのが最初だったのですが,もうずいぶんと時代が変わったと感じています.

UTF-8の普及によって,多国語が混じった文章をタイプセットできる環境が整いつつあることを知り,最近,pLaTeXからupLaTeXに乗り換え中です.今後ともよろしくお願いいたします.ありがとうございました.

aminophen への返信

Re: アクセント文字を含むPDFのしおりに不具合

- 前田 一貴 の投稿
pxjahyper を読み込んでいるならば,\pxDeclarePdfTextComposite のところだけ元々の LaTeX の動作を
すればよいのかなと思って試してみました.根本的な解決になってはいないと思いますし,
これで新しい pLaTeX での改変点が保てているのか自信がないですが…….


\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true]{hyperref}
\usepackage{etoolbox}
\makeatletter
\let\@text@composite@orig\@text@composite
\patchcmd{\@text@composite@orig}{\@text@composite@x}{\@text@composite@x@orig}{}{}
\def\@text@composite@x@orig#1{%
  \ifx#1\relax
      \expandafter\@secondoftwo
  \else
      \expandafter\@firstoftwo
  \fi
  #1}
\let\DeclareTextCompositeCommand@orig\DeclareTextCompositeCommand
\patchcmd{\DeclareTextCompositeCommand}{\@text@composite}{\@text@composite@orig}{}{}
\patchcmd{\DeclareTextCompositeCommand}{\@text@composite}{\@text@composite@orig}{}{}
\usepackage{pxjahyper}
\let\DeclareTextCompositeCoxmmand\DeclareTextCompositeCommand@orig
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{lmodern}
\begin{document}

\section{G\"odelの不確定性原理}
なんたらかんたら

\section{\'Etudes et Productions Schlumberger}
Sample
\end{document}
前田 一貴 への返信

Re: アクセント文字を含むPDFのしおりに不具合

- 北川 弘典 の投稿
・\pltx@letter のところに以前と同じ動作をするためのフラグを作る
・\pdfstringdef でそのフラグを有効化するコードをパッチする
という方針で試してみました.

----
\documentclass{article}
\usepackage[dvipdfmx]{hyperref}
\usepackage{etoolbox}
\makeatletter
\newif\if@pltx@composite@noout
\let\orig@pltx@isletter\pltx@isletter
\long\def\@firstofthree#1#2#3{#1}
\long\def\pltx@isletter{%
  \if@pltx@composite@noout\expandafter\@firstofthree\else\expandafter\orig@pltx@isletter\fi}
\patchcmd{\pdfstringdef}{\escapechar}{\@pltx@composite@noouttrue\escapechar}{}{}
\makeatother
\begin{document}

\section{G\"odel Completeness Theorem}

\ybaselineshift10pt あ\AA あ
\end{document}
北川 弘典 への返信

Re: アクセント文字を含むPDFのしおりに不具合

- 前田 一貴 の投稿
ありがとうございます.\pltx@isletter がよくわかっていなかったのですが,
そんな感じで書けば元の動作に戻るのですね.

パッケージに取り入れるとすれば,フラグの部分だけを platex に取り入れて,
\pdfstringdef へのパッチは pxjahyper などの外部パッケージで対応するとかでしょうか.
それだと platex と pxjahyper のバージョン不整合が起きたときに問題になるだろうか.
前田 一貴 への返信

Re: アクセント文字を含むPDFのしおりに不具合

- Z. R. の投稿
パッケージに取り入れるとすれば,フラグの部分だけを platex に取り入れて,
\pdfstringdef へのパッチは pxjahyper などの外部パッケージで対応するとかでしょうか.

(u)pLaTeX で「PDF文字列中のアクセント付文字」を通す方法は pxjahyper 以外にもあります。例えば、dvips + convbkmk などです。pxjaahyper を使わない場合は、「PDF 文字列中の \"o」の展開結果は異なるのですが、結局同じ問題が発生します。

だから pxjahyper で対処するのはあまり得策ではないでしょう。


hyperref にパッチを当てることなしに「PDF 文字列の処理中か」を判定する方法としては、

現在のエンコーディング(\f@encoding)が〝PD1”であるかを調べる

が利用できると思います。

Z. R. への返信

Re: アクセント文字を含むPDFのしおりに不具合

- 前田 一貴 の投稿
遅くなりましたが,ありがとうございます.
> 現在のエンコーディング(\f@encoding)が〝PD1”であるかを調べる
確かに,言われてみればそれでうまくいきそうですね.

この方針で北川さんが試しに書いて下さったようです.
https://github.com/h-kitagawa/platex/commit/4d2305f5df0d507c3a2d34b77b75aa4fb7ea7bb4

platex にどう取り込まれるかは,今後の進め方を議論中なため未定です.