-
Notifications
You must be signed in to change notification settings - Fork 215
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PDFMaker: pre-defined tcolorbox support #1637
Conversation
…xt.rb won't work for LaTeXBox overriding
うーーん、 pdfmaker:
boxsetting:
note:
style: simplesquarebox
options: ['0.8']
important:
style: ascolorbox4
options: ['2']
memo:
style: ascolorbox9
options: ['3']
info:
style: ascolorbox16
warning:
style: ascolorbox19
options: ['2']
caution:
style: ascolorbox1
options: ['colupper=white,colback=red!70!black,fontupper=\sffamily\gtfamily']
notice:
style: ascolorbox3
column:
style: ascolorbox13
options: ['fonttitle=\large\sffamily\gtfamily\bfseries,fontupper=\sffamily\gtfamily'] |
ascolorboxだと単純なのでbegin/endの1行で済むんですが、汎用の呼び出し方法としてはかなり変えられるようにしないといけなさそうで(手元で使っているようなものはもっといろいろ処理がある)、またRe:VIEWコアとのインタフェースとしては現状 review-ext.rb / layout.tex.erb / config-local.erb / styでTeXを記述 のどれかになり、この中だと扱いやすいのはreview-ext.rb くらいしかなさそうなんですよね。 optionsですが、optionsはascolorboxのどれも取れます(実際にはtcolorboxのオプションとして単なる取り込むだけ)。それ以外のthicknessなどのパラメータが環境によってあったりなかったりという感じです。
|
具体的に複雑な例を見せてもらえると対処法がわかるかもしれません。 私の方で想定していたのは↓こんな感じのコードで(動作は未検証、 require 'review/logger'
module ReVIEW
class LaTeXBox
def initialize(config)
@logger = ReVIEW.logger
@config = config
end
def tcbox
ret = ''
stys = Set.new
%w[column note memo tip info warning important caution notice].each do |name|
style = setting.dig(name, 'style')
next unless style
sty, beginenv, endenv = environment(name, style)
stys.push(sty)
endenv ||= %Q(\\end{#{setting[name]['style']}})
ret << <<EOT
\\renewenvironment{review#{name}}[1][]{%
#{beginenv}}{%
#{endenv}}
EOT
end
stys.map! do |sty|
if sty =~ /\[/ # with sty option
%Q(\\usepackage#{sty})
else
%Q(\\usepackage{#{sty}})
end
end
stys.join("\n") + "\n" + ret
end
def environment(name, style)
options = setting[name]['options'] || []
opt_args = options.map{|opt| "[#{opt}]" } || "[]"
[
'ascolorbox',
%Q(\\begin{#{style}}{##1}#{opt_args})
]
end
private
attr_reader :config
def setting
config['pdfmaker']['boxsetting']
end
end
end kmutoさんの挙げた例だと↓こんなふうに書けるはずです。 note:
style: simplesquarebox
options: ['0.8', 'colupper=white,colback=red!70!black,fontupper=\sffamily\gtfamily' ] 結局 |
あるいは路線を変えて、Re:VIEW用のenvironmentをそれぞれ作った方が早かったりするでしょうか…。 |
ありがとうございます、巧みな感じはありますが、この場合、独自にstyと環境名を用意して追加したい場合はenvironmentメソッドはどう拡張することになるのでしょう? (sty名もymlで指定させればいいのかな。) あと、中期目標としてCSSっぽく設定できるtcolorboxラップを作れば、あまりTeXに触らずに実現できるのではというのを考えていたのでした。この場合だと引数では無理で、かつ全部TeX側に押し付けても実装困難なので、ある程度Re:VIEW内のRubyコード側で整理・変換をしておきたいです。
|
(難しいな―と思いながら、このissueを眺めていたのですが、)
などなど、画一的に決めることが難しいなーと思っていました。 実際に、ascolorboxで定義している環境たちも、引数のとり方がマチマチで、唯一、追加で与えるオプション なので、kmutoさんでいうところの |
@kmuto @munepi 「引数のとり方を制限する」or 「引数をまるごと与えられるようにする(ほぼLaTeXの構文を文字列として与える)」になるんではないかなあ、と思っております。 |
ascolorboxはタイトルなしだといろいろ悲惨になったので、デフォルトにするのはよくなさそうでした。 |
ascolorboxはdead upstreamっぽいので、forkして改造することにしました。 https://github.com/kmuto/ascolorbox とりあえずキャプションなしの場合の見た目が変にならないようにするのと、オプションはバラバラにするのではなくオプション引数に混ぜたいと思っています(が、それはできるのかな…)。 |
キャプションあり・なしを1つの環境で作るのは、内部で2つに分けるにしてもかなり複雑になってしまいそうということがわかってきました。munepiさんの懸念のとおりですね…。
|
キャプションの有無等で、Ruby側から生成するコードを分けるのは普通にできるんではないかという気はします(ちょっと冗長になるかもですが)。 |
分けるのはできるけど、今展開されているRe:VIEWプロジェクト環境と互換性を持つのをどうしたものかなぁという悩みがあるのでした。tcbox拡張モードを使うならそっち、と分けちゃえばいいのかな。 |
etoolboxを使って分岐はできました。xparseは2つ持たせても解析タイミングがないのでダメっぽい。
|
etoolboxで分岐、tcbsetで取り込み時パラメータを増やせることがわかったので、わりと目処がついてきました。
オプション名はwithcaption/nocaptionよりもうちょっといい名前がないかな…。 |
pdfmaker:
boxsetting:
note:
style: simplesquarebox
options:
with_caption: "rv line width=0.8, title={NOTE: #1}"
no_caption: "rv line width=0.8"
important:
… とかでしょうか。 |
うぅ、6段になっちゃいますね…。
と指定順で表す、というのはどうでしょう…。今後これで済まなくなったときに困るかな。 |
ネストを深くしないのであればこんな感じでしょうか。 pdfmaker:
boxsetting:
note:
style: "simplesquarebox"
options: "rv line width=0.8"
options_with_caption: "rv line width=0.8, title={NOTE: #1}"
important:
.... |
なるほど、よさそうです。 |
ascolorboxはあきらめ、自前のスタイルを作りました。upLaTeX, LuaLaTeXでテスト済みです。 もう少しパターンを増やせるとよいのですが、ページ分けやキャプションの対応がだいぶ大変だったので、インターフェイスとしてこうすることにしたというのと、リファレンス実装スタイルということにしたいと思います。
tcolorbox定義にない独自のオプションを作りたいときにはtcbsetで定義することになります。 キャプション有無でどちらのマクロ定義を使うかの判断はlatexbox.rbで設定しています。 YAMLのほうは @takahashim さん提案のとおり以下の記法としました。オプションを間違ったり、styleで定義のないものを入れると変なエラーにはなりますが、そこまで面倒見るのは無理そうです。
ということで、これでひとまず入れようかと思いますがいかがでしょう。 あと変えるとすれば review-tcbox.sty が同一なのをコピーするのが微妙というところですが、これをいじるとreview-init・review-updateあたりがだいぶ複雑になってしまうのでこのままでもよいかな…と日和りました。 |
@kmuto ものすごく簡単な例ですが、 \DeclareTColorBox{rvnote}{ O{} }{
empty,
before skip=\baselineskip,
after skip=\baselineskip,
boxsep=3mm, boxrule=0mm,
top=0mm, bottom=0mm, left=0mm, right=0mm,
breakable,
% frame
borderline={0.1mm}{0mm}{black}, arc=0mm,
% title
coltitle=black, fonttitle={\bfseries},
before upper={\noindent\tcbtitle\par},
detach title,
% otherwise
#1} としておいて、 \begin{rvnote}[title={コラム見出し}]
これはノート見出しありのノート環境です。
\end{rvnote}
\begin{rvnote}[]
これはノート見出しなしのノート環境です。
\end{rvnote}
\begin{rvnote}%%<= 引数のparseの都合上、常に [] があったほうがよいと思う。ノート本文の最初が「[」で始まるかもしれないので。
これはノート見出しなしのノート環境です。
\end{rvnote} とするのはどうでしょうか? (タイトル出さないオプション |
ありがとうございます、確かに先頭[問題があるのでそのケアをしておいたほうがいいですね。 今は使ってないですが、ascolorboxを見るとtitle前提で空にしたときにひどい結果やエラーになることがままあり、tcolorbox記法内で処理分岐することもできないので、有無の環境は分けたほうがよいなと判断しました。 |
だいたい必要な対応はできたと思うので、入れます。(ドキュメントを作りたいけど、tcolorboxマニュアルになってしまいそう…) |
デフォルトの囲みがイマイチというのを言われ続けていますが、
MITライセンスの https://github.com/Yasunari/ascolorbox にサンプルが揃っていたのでこれを利用できるようにするとどうかなと思い、機能を作ってみました。
こんな感じで設定します。ascolorboxの環境によってオプションが異なるので、パラメータは各環境およびそのボックス処理メソッド依存です。
review-ext.rbでLaTeXBoxクラスに
box_スタイル名(config, name)
(configは設定構造体、nameはcolumnなど)、返り値は[スタイルファイル名, 環境開始文字列, 環境終了文字列 ]
(終了文字列は省略可)を追加すれば、それを呼び出せるようにしています。ascolorboxのほうはLuaLaTeXに対応していないのがちょっと残念なところです(数箇所直すだけで動きはするので直してもらおうかな…)。
方針としてよさそうならあとはテストなど追加しますね。