下記のソースで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のバグなのか?どなたかご教示願えないでしょうか?
このような場合は,通常次のようにしていました:
\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}
\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}
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}
以下のようにするほうが良いでしょう:
\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 様,
早速ご回答頂きありがとうございました.なるほど,確かにうまく行きますね.早速このやり方を取り入れたいと思います.
残る疑問は,TeXLive2015ではうまく行ったのに,TeXLive2016ではなぜうまく行かなくなったのか?です.
本論とは無関係な訂正ですが,「Gödelの不確定性原理」ではなくて,「Gödelの不完全性定理」とすべきでした.失礼しました.
早速ご回答頂きありがとうございました.なるほど,確かにうまく行きますね.早速このやり方を取り入れたいと思います.
残る疑問は,TeXLive2015ではうまく行ったのに,TeXLive2016ではなぜうまく行かなくなったのか?です.
本論とは無関係な訂正ですが,「Gödelの不確定性原理」ではなくて,「Gödelの不完全性定理」とすべきでした.失礼しました.
2016 でうまくいかなくなったのは forum:1934 の下の方にコメントしたとおり
「コミュニティ版 pLaTeX / upLaTeX にはアクセント文字についてエンバグが入って
しまった」からです。(文字を合成するコマンドの内部処理を変更したため。)
6 月 19 日に出した「2016/06/10 patch level 1」なら治っていると私は期待して
いますので、更新なさってください。
「コミュニティ版 pLaTeX / upLaTeX にはアクセント文字についてエンバグが入って
しまった」からです。(文字を合成するコマンドの内部処理を変更したため。)
6 月 19 日に出した「2016/06/10 patch level 1」なら治っていると私は期待して
いますので、更新なさってください。
アセト アミノフェンさん,こんにちは,
それが直っていないのでこちらで質問させていただいた次第です.私も 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)
と表示されるものです.これは最新版だと思いますがいかがでしょうか?
それが直っていないのでこちらで質問させていただいた次第です.私も 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)
と表示されるものです.これは最新版だと思いますがいかがでしょうか?
いえ、こちらも最新版 (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
を使うのが無難な方法ですし、この方法は私もおすすめします。
# 「<」を書いてしまって途中から消えちゃったので再投稿 :(
エラーが出なかったので、その前の版を試すことや警告のチェックを怠っていました。
\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
を使うのが無難な方法ですし、この方法は私もおすすめします。
# 「<」を書いてしまって途中から消えちゃったので再投稿 :(
迅速にご回答いただき,大変有難うございました.途中のマクロの部分は私にはちんぷんかんぷんなので放り投げていたのですが,原因らしきものがわかってよかったと思います.
今後はお勧めのように,角藤さんが書いてくださった方法を使うことにします.
私がTeXを使い始めたのは,TeX78をVAX-11/VMS上で使って感動したのが最初だったのですが,もうずいぶんと時代が変わったと感じています.
UTF-8の普及によって,多国語が混じった文章をタイプセットできる環境が整いつつあることを知り,最近,pLaTeXからupLaTeXに乗り換え中です.今後ともよろしくお願いいたします.ありがとうございました.
今後はお勧めのように,角藤さんが書いてくださった方法を使うことにします.
私がTeXを使い始めたのは,TeX78をVAX-11/VMS上で使って感動したのが最初だったのですが,もうずいぶんと時代が変わったと感じています.
UTF-8の普及によって,多国語が混じった文章をタイプセットできる環境が整いつつあることを知り,最近,pLaTeXからupLaTeXに乗り換え中です.今後ともよろしくお願いいたします.ありがとうございました.
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}
すればよいのかなと思って試してみました.根本的な解決になってはいないと思いますし,
これで新しい 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}
・\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}
・\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}
パッケージに取り入れるとすれば,フラグの部分だけを platex に取り入れて,
\pdfstringdef へのパッチは pxjahyper などの外部パッケージで対応するとかでしょうか.
(u)pLaTeX で「PDF文字列中のアクセント付文字」を通す方法は pxjahyper 以外にもあります。例えば、dvips + convbkmk などです。pxjaahyper を使わない場合は、「PDF 文字列中の \"o
」の展開結果は異なるのですが、結局同じ問題が発生します。
だから pxjahyper で対処するのはあまり得策ではないでしょう。
hyperref にパッチを当てることなしに「PDF 文字列の処理中か」を判定する方法としては、
現在のエンコーディング(\f@encoding
)が〝PD1”であるかを調べる
が利用できると思います。