Ticket #35484

colorbox+lstinline (フォーラムメッセージ #76839 からの引用)

Open Date: 2015-09-07 22:53 Last Update: 2016-03-31 14:29

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None

Details

フォーラム 公開討議/質問 [#76839] からの引用

[forum: 76839]

xcolorパッケージの \colorbox{} コマンドの第2引数内で\lstinline|hoge| を使うと背景色がズレます。 XeLaTeXやpLaTeXでは問題ないのですが、LuaLaTeXでltj*クラスを使うと必ず再現します。 https://twitter.com/Nymphium/status/640871466318204928 Version beta-0.79.1 (TeX Live 2014/Arch Linux) (rev 4971)

チケット #27098 「listings で白筋」への対応のため,lstlisting, lstinline による出力で 各行の高さ・深さを 0 にする処理を加えていますが,それが裏目に出ているようです.

(また,\colorbox{blue}{\lstinline|あいうえお|} を使うと ! Missing $ inserted. のエラーも出ますね.)

Ticket History (3/10 Histories)

2015-09-07 22:53 Updated by: h7k
  • New Ticket "colorbox+lstinline (フォーラムメッセージ #76839 からの引用)" created
2015-09-07 23:27 Updated by: h7k
Comment

backgroundcolor の処理は lstmisc.sty 中で行われていますが, その 1629 行目に

\lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}%
とあり,高さ・深さが \strutbox のそれと決め打ちされています. ここをうまく直せればいいのですが.

2015-09-08 06:02 Updated by: h7k
Comment

高さ・深さが \strutbox のそれと決め打ちされています.

「白筋」の要因がなんとなくわかりました. 欧文クラスで LuaTeX-ja を使うと,

\ht\strutbox = 0.7\baselineskip = 8.4 pt,
\cht = 0.962216 * 0.88 * 10 pt = 8.4675 pt
となり,背景色の高さ \ht\strutbox, 深さ \dp\strutbox (= 0.3\baselineskip) から 0.0675 pt だけ和文文字がはみ出します. (注意深く見れば,lstlisting 環境の中身の1行目に和文文字を持ってきた時に,和文文字が若干はみ出ることに気づくかもしれません).

さて,はみ出し量はわずかですが,lstlistings 環境で出力される各行の高さが \baselineskip を超えてしまうのがキーになります. 出力処理のところ(詳細未確認)で \lineskiplimit = 0 pt, \lineskip = 1 pt と設定されているので, わずかにはみ出しただけでも背景色で塗られた箱と箱の間に1 pt の白筋が出てしまう,というわけです.

問題は,「背景色で塗る」ことが各行の中身を実際に出力する前に行われることで,これによって 「その行に和文文字がある」かどうかを事前に調べることが出来ないことになります.対応策として,

  • 各行の背景色で塗る処理を,高さ max(\ht\strutbox, \cht), 深さ max(\dp\strutbox, \cdp) の箱を使うように改める.
  • \lineskiplimit を変更し,行送りを \baselineskip に揃える().

を思いつきました.個人的には後者が好みです(1行目に和文文字が来た場合の問題はどうにもならないですが,そこは微少量のはみ出しなので大きな問題ではないと思います). 今日の午後〜夜にでもコードを書いてみます.

2015-09-09 23:29 Updated by: None
Comment

コミットをみてみました。ただlistingsに frame=single などを入れると上部にでかい白帯が出るようになってしまいました。

2015-09-10 05:12 Updated by: h7k
Comment

None への返信

コミットをみてみました。ただlistingsに frame=single などを入れると上部にでかい白帯が出るようになってしまいました。

すみません,frame=single で白帯が出る問題は,commit 5cc51f7 で直したつもりです.

2015-09-10 07:29 Updated by: h7k
Comment

h7k への返信

すみません,frame=single で白帯が出る問題は,commit 5cc51f7 で直したつもりです.

しまった,手元で直したのに満足して,push するのを忘れてしまいました.今日の夜に push します.

2015-09-12 12:54 Updated by: kmaeda
Comment

h7k への返信

しまった,手元で直したのに満足して,push するのを忘れてしまいました.今日の夜に push します.

遅くなりましたが,確認しました.直ったようです.

あとは

(また,\colorbox{blue}{\lstinline|あいうえお|} を使うと ! Missing $ inserted. のエラーも出ますね.)

も解決するとよいですね.これは元々 uplatex + jlisting でも

! Invalid code (12354), should be in the range 0..255.
と出てだめみたいです.

2015-09-22 20:04 Updated by: h7k
Comment

(また,\colorbox{blue}{\lstinline|あいうえお|} を使うと ! Missing $ inserted. のエラーも出ますね.)

新バージョン 20150922.0 を出しましたが,まだこっちは直していません.

2015-11-05 22:21 Updated by: h7k
Comment

\colorbox{blue}{\lstinline|あいうえお|}

listings.sty の処理をまだ完全にわかっているわけではないですが, aca0dcf で対応してみたつもりです. (\lstinline!...! で,中身の内容を全部トークンレジスタに読んで,それを listings の 出力命令に変換する処理を行うようにしました.どんな副作用があるかわからないです)

2016-03-31 14:29 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2016-03-31 14:29
Comment

こちらもひとまず直っているようなので,完了とします.何かあれば再オープンしましょう.

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login