qinglee / wrapstuff

Wrapping text around stuff
https://ctan.org/pkg/wrapstuff
LaTeX Project Public License v1.3c
11 stars 4 forks source link

`wrapstuff` 环境内容为 `tabular` 环境的垂直偏移问题 #5

Closed xkwxdyy closed 2 years ago

xkwxdyy commented 2 years ago

系统信息

mac,texlive2022,2022-07-30更新过宏包,根据 log 信息,使用的确实是最新的宏包版本 wrapstuff 2022/07/26 v0.2

MWE

描述:因为所需要绕排的图片下方有居中文字,而没有“图x”字样,所以欲采用 \centering

\documentclass{ctexart}
\usepackage{wrapstuff}
\usepackage{graphicx}

\begin{document}

据传说,希腊人为了夺回海伦,举兵围攻特洛伊城,十年不下。最后他们佯逃,留着一匹腹内埋伏精兵的大木马在城外,特洛伊人看见木马,把它移到城内。典祭官拉奥孔当时极力劝阻,说留下木马是希腊人的诡计。他这番忠告激怒了偏心于希腊人的天神。当拉奥孔典祭时,河里就爬出两条大蛇,把拉奥孔和他的两个儿子一齐绞死了。

% \begin{wrapstuff}[type = table]
% \begin{wrapstuff}[voffset = 5.6em]
\begin{wrapstuff}
  % \begin{tabular}{c}
    \centering
    \includegraphics[width = 5cm]{example-image-a.png} \\
    雕塑《拉奥孔》
  % \end{tabular}
\end{wrapstuff}

这是罗马诗人维吉尔《伊尼特》第二卷里最有名的一段。十六世纪在罗马发现的拉奥孔雕像似以这段史诗为蓝本。莱辛拿这段诗和雕像互较,发现几个重要的异,点。因为要解释这些异点,他才提出诗画异质说。

据史诗,拉奥孔在被捆时放声号叫;在雕像中他的面孔只表现一种轻微的叹息,具有希腊艺术所特有的恬静与肃穆。为什么雕像的作者不表现诗人所描写的号啕呢? 希腊人在诗中并不怕表现苦痛,而在造型艺术中却永远避免痛感所产生的面孔筋肉挛曲的丑状。在表现痛感之中,他们仍求形象的完美。

其次,据史诗,那两条长蛇绕腰三圈,绕颈两圈,而在雕像中它们仅绕着两腿。因为作者要从全身筋肉上表现出拉奥孔的苦痛,如果依史诗,筋肉方面所表现的苦痛就看不见了。同理,雕像的作者让拉奥孔父子赤裸着身体,虽然在史诗中拉奥孔穿着典祭官的衣服。

\end{document}

但是有报错

Something's wrong--perhaps a missing \item.

于是改成了 tabular 环境达到居中效果:

\documentclass{ctexart}
\usepackage{wrapstuff}
\usepackage{graphicx}

\begin{document}

据传说,希腊人为了夺回海伦,举兵围攻特洛伊城,十年不下。最后他们佯逃,留着一匹腹内埋伏精兵的大木马在城外,特洛伊人看见木马,把它移到城内。典祭官拉奥孔当时极力劝阻,说留下木马是希腊人的诡计。他这番忠告激怒了偏心于希腊人的天神。当拉奥孔典祭时,河里就爬出两条大蛇,把拉奥孔和他的两个儿子一齐绞死了。

% \begin{wrapstuff}[type = table]
% \begin{wrapstuff}[voffset = 5.6em]
\begin{wrapstuff}
  \begin{tabular}{c}
    \includegraphics[width = 5cm]{example-image-a.png} \\
    雕塑《拉奥孔》
  \end{tabular}
\end{wrapstuff}

这是罗马诗人维吉尔《伊尼特》第二卷里最有名的一段。十六世纪在罗马发现的拉奥孔雕像似以这段史诗为蓝本。莱辛拿这段诗和雕像互较,发现几个重要的异,点。因为要解释这些异点,他才提出诗画异质说。

据史诗,拉奥孔在被捆时放声号叫;在雕像中他的面孔只表现一种轻微的叹息,具有希腊艺术所特有的恬静与肃穆。为什么雕像的作者不表现诗人所描写的号啕呢? 希腊人在诗中并不怕表现苦痛,而在造型艺术中却永远避免痛感所产生的面孔筋肉挛曲的丑状。在表现痛感之中,他们仍求形象的完美。

其次,据史诗,那两条长蛇绕腰三圈,绕颈两圈,而在雕像中它们仅绕着两腿。因为作者要从全身筋肉上表现出拉奥孔的苦痛,如果依史诗,筋肉方面所表现的苦痛就看不见了。同理,雕像的作者让拉奥孔父子赤裸着身体,虽然在史诗中拉奥孔穿着典祭官的衣服。

\end{document}

image

但是此时发现,图片的内容整体往下偏移了。log信息:

Package: wrapstuff 2022/07/26 v0.2 Wrapping text around stuff
\g__wstf_hang_ht_dim=\dimen173
\g__wstf_total_ht_dim=\dimen174
\g__wstf_stuff_ht_dim=\dimen175
\g__wstf_stuff_wd_dim=\dimen176
\g__wstf_first_dp_dim=\dimen177
\g__wstf_first_sep_dim=\dimen178
\g__wstf_prevdepth_dim=\dimen179
\g__wstf_column_ht_dim=\dimen180
\g__wstf_window_ht_dim=\dimen181
\g__wstf_remaining_dim=\dimen182
\g__wstf_column_room_dim=\dimen183
\g__wstf_parshape_indent_dim=\dimen184
\g__wstf_parshape_length_dim=\dimen185
\g__wstf_top_int=\count287
\g__wstf_column_int=\count288
\g__wstf_window_int=\count289
\g__wstf_stauts_box=\box55
\g__wstf_status_int=\count290
\c__wstf_none_node=\count291
\g__wstf_stuff_box=\box56
\l__wstf_shift_dim=\dimen186
\l__wstf_width_dim=\dimen187
\l__wstf_height_dim=\dimen188
\c@wrapstuff=\count292
\l__wstf_body_box=\box57
\l__wstf_window_box=\box58
\l__wstf_window_int=\count293
\g__wstf_line_int=\count294
\l__wstf_window_line_int=\count295
\l__wstf_l_dim=\dimen189
\l__wstf_r_dim=\dimen190
\l__wstf_min_dim=\dimen191
\l__wstf_line_dim=\dimen192
\l__wstf_window_dim=\dimen193
\l__wstf_display_dim=\dimen194
\l__wstf_voffset_dim=\dimen195
\l__wstf_leftsep_dim=\dimen196
\l__wstf_rightsep_dim=\dimen197
\l__wstf_main_width_dim=\dimen198
\g__wstf_parshape_int=\count296
\g__wstf_hangafter_int=\count297
\g__wstf_hangindent_dim=\dimen199
\g__wstf_left_skip=\skip59
\g__wstf_right_skip=\skip60
\g__wstf_parfill_skip=\skip61
\g__wstf_baseline_skip=\skip62
\g__wstf_main_left_skip=\skip63
\l__wstf_bottom_box=\box59
\g__wstf_eqbody_box=\box60
\g__wstf_eqnum_box=\box61
\g__wstf_equation_box=\box62
\g__wstf_pos_int=\count298
\g__wstf_pos_skip=\skip64
\l__wstf_save_body_box=\box63
\c__wstf_break_int=\count299
\g__wstf_ht_dim=\dimen256
\l__wstf_l_box=\box64
\l__wstf_r_box=\box65
\l__wstf_last_l_box=\box66
\l__wstf_last_r_box=\box67
\g__wstf_window_box=\box68
\l__wstf_window_ht_dim=\dimen257
\l__wstf_par_skip=\skip65
\g__wstf_pre_skip=\skip66
\c__wstf_ignore_depth_dim=\dimen258
\g__wstf_last_box=\box69
\g__wstf_display_box=\box70
\g__wstf_display_pre_dim=\dimen259
\l__wstf_add_box=\box71
\g__wstf_pos_box=\box72
\l__wstf_last_skip=\skip67
\g__wstf_last_skip=\skip68
\l__wstf_last_int=\count300
\l__wstf_last_box=\box73
\g__wstf_display_pre_int=\count301
\g__wstf_display_pre_skip=\skip69
\l__wstf_top_int=\count302

然后可以通过 voffset 进行调整:

\documentclass{ctexart}
\usepackage{wrapstuff}
\usepackage{graphicx}

\begin{document}

据传说,希腊人为了夺回海伦,举兵围攻特洛伊城,十年不下。最后他们佯逃,留着一匹腹内埋伏精兵的大木马在城外,特洛伊人看见木马,把它移到城内。典祭官拉奥孔当时极力劝阻,说留下木马是希腊人的诡计。他这番忠告激怒了偏心于希腊人的天神。当拉奥孔典祭时,河里就爬出两条大蛇,把拉奥孔和他的两个儿子一齐绞死了。

% \begin{wrapstuff}[type = table]
\begin{wrapstuff}[voffset = 5.6em]
% \begin{wrapstuff}
  \begin{tabular}{c}
    % \centering
    \includegraphics[width = 5cm]{example-image-a.png} \\
    雕塑《拉奥孔》
  \end{tabular}
\end{wrapstuff}

这是罗马诗人维吉尔《伊尼特》第二卷里最有名的一段。十六世纪在罗马发现的拉奥孔雕像似以这段史诗为蓝本。莱辛拿这段诗和雕像互较,发现几个重要的异,点。因为要解释这些异点,他才提出诗画异质说。

据史诗,拉奥孔在被捆时放声号叫;在雕像中他的面孔只表现一种轻微的叹息,具有希腊艺术所特有的恬静与肃穆。为什么雕像的作者不表现诗人所描写的号啕呢? 希腊人在诗中并不怕表现苦痛,而在造型艺术中却永远避免痛感所产生的面孔筋肉挛曲的丑状。在表现痛感之中,他们仍求形象的完美。

其次,据史诗,那两条长蛇绕腰三圈,绕颈两圈,而在雕像中它们仅绕着两腿。因为作者要从全身筋肉上表现出拉奥孔的苦痛,如果依史诗,筋肉方面所表现的苦痛就看不见了。同理,雕像的作者让拉奥孔父子赤裸着身体,虽然在史诗中拉奥孔穿着典祭官的衣服。

\end{document}

image

问题

请问以上现象是 bug 还是我的操作哪里有问题?或者说对于“图”+正下方居中的不带“图x”字样文字的整体与文字的绕排,应该如何使用 wrapstuff 才能得到相对自动化的结果?

muzimuzhi commented 2 years ago

设置 width 可解:

% !TeX TS-program = xelatex
\documentclass{ctexart}
\usepackage{wrapstuff}
\usepackage{graphicx}
\usepackage{zhlipsum}

\begin{document}
\zhlipsum[1]
\begin{wrapstuff}[width=5cm]
    \centering
    \includegraphics[width = 5cm]{example-image-a} \\
    雕塑《拉奥孔》
\end{wrapstuff}
\zhlipsum[2]
\end{document}

image

目前有一个(没有文档化的)逻辑,如果 width == 0pt (初始值),wrapped stuff 是直接包在 \hbox 里;如果 width > 0pt,会在 \hbox 里加一层 minipage。(所以你手动加一层 minipage 来实现居中,而不是 tabular,自然也是可以的。) https://github.com/qinglee/wrapstuff/blob/e8911596ccf0b0cdf428f0a63be1921216a21653/wrapstuff.dtx#L754-L759

另外,报错 Something's wrong--perhaps a missing \item. 只由 \hbox{\centering abc \\ def} 就能复现。报错是因为 \centering 不应该用于 hmode,具体是因为 \centering 会修改 \\,使其在 hmode 下使用时报错。

xkwxdyy commented 2 years ago

设置 width 可解:

% !TeX TS-program = xelatex
\documentclass{ctexart}
\usepackage{wrapstuff}
\usepackage{graphicx}
\usepackage{zhlipsum}

\begin{document}
\zhlipsum[1]
\begin{wrapstuff}[width=5cm]
    \centering
    \includegraphics[width = 5cm]{example-image-a} \\
    雕塑《拉奥孔》
\end{wrapstuff}
\zhlipsum[2]
\end{document}

image

目前有一个(没有文档化的)逻辑,如果 width == 0pt (初始值),wrapped stuff 是直接包在 \hbox 里;如果 width > 0pt,会在 \hbox 里加一层 minipage。(所以你手动加一层 minipage 来实现居中,而不是 tabular,自然也是可以的。)

https://github.com/qinglee/wrapstuff/blob/e8911596ccf0b0cdf428f0a63be1921216a21653/wrapstuff.dtx#L754-L759

另外,报错 Something's wrong--perhaps a missing \item. 只由 \hbox{\centering abc \\ def} 就能复现。

感谢您的回复~

muzimuzhi commented 2 years ago

(引用全部内容然后简单致谢,只会缩短页面滚动条、降低页面信息密度,感觉不必要。需要有针对的回复时,也是只引用相关内容即可。)

qinglee commented 2 years ago

tabular 默认是垂直居中对齐,深度比较大,这个问题就暴露出来了。

xkwxdyy commented 2 years ago

(引用全部内容然后简单致谢,只会缩短页面滚动条、降低页面信息密度,感觉不必要。需要有针对的回复时,也是只引用相关内容即可。)

了解了,是我考虑不周,抱歉,谢谢您及时指出问题。