As the question described, I use the sidebyside "wheel" of the tcolorbox
package to create an environment for achieve "left: text, and right: figure". Is it possible to create this "wheel" without loading the tcolorbox
package?
What's more, I don't want to use the minipage
or paracol
environment, because for the former I need to type \noindent
manually and for the latter, I need to type \vfill
twice to center the figure on the right vertically.
The following is the MWE:
\documentclass{article}
\usepackage{lipsum,amsthm,tcolorbox}
\NewTColorBox { textfig } { O { .64\linewidth } }
{
sidebyside, sidebyside gap = .02\linewidth, boxsep = 0pt,
left = 0pt, right = 0pt, top = 3pt, bottom = 0pt,
lefthand width = #1, standard jigsaw, opacityback = 0, frame empty
}
\newtheorem{problem}{Problem}
\begin{document}
\begin{textfig}
\begin{problem}
\lipsum[2]
\end{problem}
\tcblower
\centering
\includegraphics[width = .5\linewidth]{example-image-a}
\end{textfig}
\end{document}
封装一下 minipage
,设置 \parindent=0pt
。
\documentclass{article}
\ExplSyntaxOn
\box_new:N \l__skyrmion_left_box
\box_new:N \l__skyrmion_right_box
\box_new:N \l__skyrmion_seg_box
\keys_define:nn { skyrmion }
{
lefthand~ratio .fp_set:N = \l__skyrmion_left_ratio_fp ,
lefthand~width .dim_set:N = \l__skyrmion_left_dim ,
righthand~ratio .dim_set:N = \l__skyrmion_right_ratio_fp ,
righthand~width .dim_set:N = \l__skyrmion_right_dim ,
sidebyside~gap .dim_set:N = \l__skyrmion_gap_dim ,
sidebyside~gap .initial:n = 10mm ,
before~left .tl_set:N = \l__skyrmion_before_left_tl ,
before~right .tl_set:N = \l__skyrmion_before_right_tl ,
}
\cs_new_protected:Npn \twopartsplit
{
\dim_compare:nNnTF \l__skyrmion_right_dim < { 10sp }
{
%% Width is too small! Abort!
}
{
\__skyrmion_twopart_end_save:
\__skyrmion_twopart_save:NN \l__skyrmion_right_box \l__skyrmion_right_dim
\l__skyrmion_before_right_tl \ignorespaces
}
}
\NewDocumentEnvironment{twopart}{ O{} }
{
\par \keys_set:nn { skyrmion } {#1}
\__skyrmion_calc_width:
\__skyrmion_twopart_save:NN \l__skyrmion_left_box \l__skyrmion_left_dim
\l__skyrmion_before_left_tl \ignorespaces
}
{
\__skyrmion_twopart_end_save:
\__skyrmion_twopart_typeset:
}
\cs_new:Npn \__skyrmion_calc_width:
{
\bool_lazy_and:nnTF
{ \dim_compare_p:nNn \l__skyrmion_left_dim = \c_zero_dim }
{ \dim_compare_p:nNn \l__skyrmion_right_dim = \c_zero_dim }
{
\bool_lazy_and:nnTF
{ \fp_compare_p:nNn { abs ( \l__skyrmion_left_ratio_fp ) } < { 0.0001 } }
{ \fp_compare_p:nNn { abs ( \l__skyrmion_right_ratio_fp ) } < { 0.0001 } }
{
\dim_set:Nn \l__skyrmion_left_dim { 0.5\linewidth - 0.5\l__skyrmion_gap_dim }
\dim_set:Nn \l__skyrmion_right_dim { \l__skyrmion_left_dim }
}
{
\fp_compare:nNnTF { abs ( \l__skyrmion_left_ratio_fp ) } < { 0.0001 }
{
\dim_set:Nn \l__skyrmion_right_dim
{
\fp_use:N \l__skyrmion_right_ratio_fp
\dimexpr \linewidth - \l__skyrmion_gap_dim \relax
}
\dim_set:Nn \l__skyrmion_left_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_right_dim }
}
{
\dim_set:Nn \l__skyrmion_left_dim
{
\fp_use:N \l__skyrmion_left_ratio_fp
\dimexpr \linewidth - \l__skyrmion_gap_dim \relax
}
\dim_set:Nn \l__skyrmion_right_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_left_dim }
}
}
}
{
\dim_compare:nNnTF \l__skyrmion_left_dim = \c_zero_dim
{
\dim_set:Nn \l__skyrmion_left_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_right_dim }
}
{
\dim_set:Nn \l__skyrmion_right_dim
{ \linewidth - \l__skyrmion_gap_dim - \l__skyrmion_left_dim }
}
}
}
\cs_new:Npn \__skyrmion_twopart_save:NN #1 #2
{
\hbox_set:Nw #1
\minipage {#2}
\setlength{\parindent}{0pt}
}
\cs_new:Npn \__skyrmion_twopart_end_save:
{
\endminipage
\hbox_set_end:
}
\cs_new:Npn \__skyrmion_seg: { } % 画线,可以用 tikz 等等
\cs_new:Npn \__skyrmion_twopart_typeset:
{
\hbox_to_wd:nn { \linewidth }
{
\hbox_set:Nn \l__skyrmion_seg_box { \__skyrmion_seg: }
\hbox_unpack_drop:N \l__skyrmion_left_box
\hss \clap { \box_use_drop:N \l__skyrmion_seg_box } \hss
\hbox_unpack_drop:N \l__skyrmion_right_box
}
}
\ExplSyntaxOff
\usepackage{lipsum,amsthm,tcolorbox}
\NewTColorBox { textfig } { O { .64\linewidth } }
{
sidebyside, sidebyside gap = .02\linewidth, boxsep = 0pt,
left = 0pt, right = 0pt, top = 3pt, bottom = 0pt,
lefthand width = #1, standard jigsaw, opacityback = 0, frame empty
}
\newtheorem{problem}{Problem}
\begin{document}
\begin{textfig}
\begin{problem}
\lipsum[2]
\end{problem}
\tcblower
\centering
\includegraphics[width = .5\linewidth]{example-image-a}
\end{textfig}
\begin{twopart}[sidebyside gap=.02\linewidth, lefthand width=.64\linewidth]
\begin{problem}
\lipsum[2]
\end{problem}
\twopartsplit
\centering
\includegraphics[width = .5\linewidth]{example-image-a}
\end{twopart}
\end{document}
也可以用 coffin
,代码是相似的。
只有用
paracol
实现才可以分页,其它都不行。最近使用时,发现了一个问题:
在
twopart
环境中的problem
环境中,如果使用enumerate
同时使用命令\leavevmode
以保证编号另起一行,则problem
环境前的空隙会变小;如果使用enumerate
时不使用\leavevmode
,或者干脆不在里面放enumerate
,则间距正常. 请教下这个问题如何处理?MWE如下. 所说的间距间隔变小,指
Problem 3
和Problem 2
之间的空隙或Problem 4
和Problem 3
之间的距离;而Problem 1
和Problem 2
以及Problem 4
和Problem 5
之间的距离则正常.@u79794
`
ExplSyntaxOnmakeatletter
box_new:N l__skyrmion_left_box
box_new:N l__skyrmion_right_box
box_new:N l__skyrmion_seg_box
dim_new:N l__skyrmion_boxdepth_dim
dim_new:N g__skyrmion_left_boxdepth_dim
dim_new:N g__skyrmion_right_boxdepth_dim
keys_define:nn { skyrmion }
{
}
cs_new_protected:Npn twopartsplit
{
}
NewDocumentEnvironment{twopart}{ O{} }
{
}
{
}
cs_new:Npn __skyrmion_calc_width:
{
}
cs_new:Npn __skyrmion_twopart_save:NN #1 #2
{
}
cs_new:Npn __skyrmion_twopart_end_save:n #1
{
}
cs_new_eq:NN __skyrmion_endminipage:n endminipage
tl_replace_once:Nnn __skyrmion_endminipage:n { egroup } { egroup #1 }
exp_args:Nno use:n { cs_set:Npn __skyrmion_endminipage:n #1 } { __skyrmion_endminipage:n }
cs_new:Npn __skyrmion_seg: { } % 画线,可以用 tikz 等等
cs_new:Npn __skyrmion_twopart_typeset:
{
}
ExplSyntaxOffmakeatother