NewTCBListingにおいて、1行目のみ出力がおかしい

NewTCBListingにおいて、1行目のみ出力がおかしい

- KK TeX の投稿
返信数: 5

今日、今まで使用していた

\newtcblisting{lstlistings}{%
  (省略)
}

によるボックスを改良しようと思い、

\NewTCBListing{lstlistingTest}{ m m o O{black} }{%
(省略)
}

によるボックスを作成しました。
しかし、どういうわけか、定義方法を変えた途端に1行目の出力だけがバグるようになってしまいました。なんの仕様によるものなのか見当がつかないため、ご質問させていただいております。ご回答いただける方がいらっしゃいましたらお願い申し上げます。

必要になりうるファイルは以下に全て添付しておきましたので、ご使用ください。
KK TeX への返信

Re: NewTCBListingにおいて、1行目のみ出力がおかしい

- KK TeX の投稿
追記:自分で色々テストして判明したのですが、出力言語の所を引数にした途端にこの出力不良が発生するようです。
KK TeX への返信

Re: NewTCBListingにおいて、1行目のみ出力がおかしい

- 和田 勇 の投稿

代替案はすぐには出てきませんが4番目の引数として \newtcblisting を取り込んでいるのだと思います。

     \NewTCBListing{lstlistingTest}{ m m o O{black} }

     \begin{lstlistingTest}{タイトル}{TeX}[サブタイトル]
         \newtcblisting{....}

なのでテストされるなら  \begin{lstlistingTest}{タイトル}{TeX}[サブタイトル][pink] のように 明示的に4番目のオプションを指定すれば確認できると思います。

和田 勇 への返信

Re: NewTCBListingにおいて、1行目のみ出力がおかしい

- KK TeX の投稿

確かに、それで出力が改善されました!原理はよくわからないですが、ひとまず原因がわかって安心です。
いつもありがとうございます!

KK TeX への返信

Re: NewTCBListingにおいて、1行目のみ出力がおかしい

- Z. R. の投稿

tcolorboxのマニュアルにおいて、\NewTCBListing の解説の少し後(最新版だとp.339)に注意書きがあり、そこでは
「引数仕様の末尾※にオプション引数(Oやo)を置きたい場合は“!”を付けろ」
と言っています。
※正確には「最後の必須引数より後」。

この“!”は「オプション引数は空白を置かずに直後に書く」という仕様を強制するものです。“!”無しの既定動作では、オプション引数(#3や#4)の存在を調べるために空白を飛ばして先を読もうとするので、ここで「本来verbatimで読み取るべき文字列(環境の中身の先頭の \newtcblisting など)を非verbatim状態で読み取ってしまう」という不都合な動作が生じるわけです。
※詳細は usrguide の2.6節を参照。

これに従うと、問題のlstlistingTest環境の定義は

\NewTCBListing{lstlistingTest}{ m m !o !O{black} }{%

となるべきで、実際にこれなら所望通りの出力が得られています。

Z. R. への返信

Re: NewTCBListingにおいて、1行目のみ出力がおかしい

- KK TeX の投稿

確かに望んでいた出力を得られました!その部分は見落としていました。ありがとうございます。