解释为什么它不起作用:

解释为什么它不起作用:

以下代码来自该 SE 查询:我可以把宽度未知的超大棺材放在中央吗?。它由 @cfr 发布,并附带输出,因此,据推测它曾经起作用:

\begin{filecontents}{pic.tex}
\documentclass{standalone}
\begin{document}
\begin{tikzpicture}
  \shade [left color=Cerulean, right color=Cerulean, middle color=MidnightBlue] (0,0) rectangle (200mm,10mm);
\end{tikzpicture}
\end{document}
\end{filecontents}
\documentclass[a4paper,x11names,svgnames,dvipsnames]{article}
\usepackage{geometry,standalone,tikz,xcoffins,calc}
\begin{document}
\NewCoffin\TestCoffin
\SetHorizontalCoffin\TestCoffin{\input{pic}}

\MarkCoffinHandle\TestCoffin[hc,vc]{magenta}
\MarkCoffinHandle\TestCoffin[l,vc]{magenta}

Can I centre the coffin \emph{without} knowing the width of the picture?

This works:\par
\noindent
\TypesetCoffin\TestCoffin[l,vc](-.5\CoffinWidth\TestCoffin+.5\textwidth,0pt)
\bigskip

This doesn't:\par
{\centering
  \TypesetCoffin\TestCoffin[hc,vc]\par}


\end{document}

当我现在运行该代码时,它会失败并出现以下错误:

./Coffin_mwe_001.tex:22: Illegal unit of measure (pt inserted).
<to be read again> 
                   .
l.22 ...5\CoffinWidth\TestCoffin+.5\textwidth,0pt)

如果我删除小数因子,.5代码 就-.5\CoffinWidth\TestCoffin可以正常-\CoffinWidth\TestCoffin/2工作,但除以非整数,不出所料,不起作用。还要注意整数因素\CoffinWidth也能正常工作。

我似乎无法在 SE 上找到有关此问题的讨论。有解决方法吗?

答案1

解释为什么它不起作用:

\CoffinWidth定义为\dim_eval:n { \coffin_wd:N #1 }\dim_eval:n扩展为 ,\dim_use:N \__dim_eval:w #1\__dim_eval_end:因此上面的内容变为\dim_use:N \__dim_eval:w \coffin_wd:N #1\__dim_eval_end:。也就是说(删除 l3 命名法)与 相同\the\dimexpr\wd#1\relax

您在可选参数 的内部使用它,\TypesetCoffin它又是 a \dimexpr,所以类似于\dimexpr\the\dimexpr\wd\TestCoffin\relax\relax。在下面,我会偶尔删除外部\dimexpr,我希望它仍然可以理解。

\the\dimexpr\wd#1\relax会扩展为类似<float>pt。下面让我们假设 是<float>(相当不引人注目的)浮点数1.0。请注意,\the\<dimen>即使它不会产生不同的结果(因此,如果唯一的小数位是 0),也始终返回一个句点。现在,通过我们的例子,我们来看看如果在它前面加上一个因子会发生什么:

选择一个整数因子(假设为2),得到的结果是21.0pt,它是有效的,但肯定不是的两倍1.0pt。使用另一个浮点数作为因子(假设为0.5),得到的0.51.0pt结果是无效的长度,因此是错误的。

我们现在做什么?一种方法是使用整数 2 进行除法(将外部的放回原处\dimexpr并用我们的示例替换内部的1.0pt):\dimexpr 1.0pt/2\relax是有效输入。另一种方法是使用乘法,同样只使用整数:\dimexpr1.0pt*2\relax仍然有效。但是如果我们想使用浮点数作为因子怎么办?我们必须将其重新转换为 TeX 认为是维度的东西,这就是我们\dimexpr在内部表达式中使用的原因:.5\dimexpr 1.0pt\relax再次有效。

将其转换成可以完成预期任务的代码:

\dimexpr通过我们认为可行的解决方案的包装,您的代码将变为:

\TypesetCoffin\TestCoffin[l,vc](-.5\dimexpr\CoffinWidth\TestCoffin\relax+.5\textwidth,0pt)

我们完成了。完成 MWE:

\begin{filecontents}{pic.tex}
\documentclass{standalone}
\begin{document}
\begin{tikzpicture}
  \shade [left color=Cerulean, right color=Cerulean, middle color=MidnightBlue] (0,0) rectangle (200mm,10mm);
\end{tikzpicture}
\end{document}
\end{filecontents}
\documentclass[a4paper,x11names,svgnames,dvipsnames]{article}
\usepackage{geometry,standalone,tikz,xcoffins,calc}
\begin{document}
\NewCoffin\TestCoffin
\SetHorizontalCoffin\TestCoffin{\input{pic}}

\MarkCoffinHandle\TestCoffin[hc,vc]{magenta}
\MarkCoffinHandle\TestCoffin[l,vc]{magenta}

Can I centre the coffin \emph{without} knowing the width of the picture?

This works:\par
\noindent
\TypesetCoffin\TestCoffin[l,vc](-.5\dimexpr\CoffinWidth\TestCoffin\relax+.5\textwidth,0pt)
\bigskip

This doesn't:\par
{\centering
  \TypesetCoffin\TestCoffin[hc,vc]\par}


\end{document}

相关内容