我正在尝试编写一个命令,按顺序执行以下操作:
- 测量输入单词的宽度。
- 将该值与现有值进行比较。
- 如果输入单词的宽度较大,则将该度量作为值。否则,不执行任何操作。
以下代码出了什么问题?
\documentclass{article}
\usepackage{ifthen}
\usepackage{calc}
\usepackage{showframe}
\newlength\shape
\setlength{\shape}{1mm}
\newcommand{\shifter}[1]{\ifthenelse
{\shape<\widthof{#1}} % If the width of the input word is greater than the length of \shape,
{\setlength{\shape}{\widthof{#1}}} % then make the length of \shape equal to the width of the input word.
{} % Otherwise, do nothing.
}%
\setlength{\parindent}{0pt}
\begin{document}
\hspace{\shape}Hello % Output as expected: `Hello' is indented 1mm from the left margin.
\shifter{Tyrannosaurus}
\hspace{\shape}Hello % Output not as expected. I wanted `Hello' to be indented the width of the word `Tyrannosaurus' from the left margin. Instead, `Hello' is indented 1mm from the left margin.
\end{document}
可能相关:我收到以下错误:
这里应该有一个数字;我插入了“0”。
为什么?
答案1
您既不需要ifthen
也不需要calc
。只需定义第二个维度进行比较,将其设置为宽度settowidth
(非常具有描述性),并使用更强大的条件etoolbox
:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{showframe}
\newdimen\shape
\setlength{\shape}{1mm}
\newdimen\shapecompare
\newcommand{\shifter}[1]{%
\settowidth\shapecompare{#1}%
\ifdimless{\shape}{\shapecompare}%
{\setlength{\shape}{\shapecompare}}%
{}%
}%
\setlength{\parindent}{0pt}
\begin{document}
\hspace{\shape}Hello
\shifter{Tyrannosaurus}
Tyrannosaurus
\hspace{\shape}Hello
\end{document}
答案2
您的代码存在一些问题。
第一个问题:如果您想比较\ifthenelse
您需要的长度\lengthtest
(只有整数之间的比较不需要任何东西)。
第二个问题:\widthof
不起作用\lengthtest
。
修复:使用临时维度寄存器。
\documentclass{article}
\usepackage{ifthen}
\usepackage{showframe}
\newlength\shape
\setlength{\shape}{1mm}
\newcommand{\shifter}[1]{%
\settowidth{\dimen0}{#1}%
\ifthenelse{\lengthtest{\shape<\dimen0}}{\setlength{\shape}{\dimen0}}{}%
}
\setlength{\parindent}{0pt}
\begin{document}
\hspace{\shape}Hello
\shifter{Tyrannosaurus}
\hspace{\shape}Hello
Tyrannosaurus % check the space
\end{document}
实际上你并不需要ifthen
:
\newcommand{\shifter}[1]{%
\settowidth{\dimen0}{#1}%
\ifdim\shape<\dimen0
\setlength{\shape}{\dimen0}%
\fi
}