我需要获取长度列表中的第一个长度并将其存储在变量中。
这是我目前得到的:
\documentclass[12pt,a4paper]{article}
\newlength{\mylength}
%% does not work at all
%\usepackage{xstring}
%\newcommand{\mylengthlist}[1]{
% \noexpandarg%
% \def\firstitem{\StrBefore{#1}{,}}%
% \setlength{\mylength}{\firstitem}%
%}
% works, but this seems to much processing for this task
\usepackage{xparse}
\NewDocumentCommand{\mylengthlist}{
>{\SplitList{,}} m
}{
\thisisthefirsttrue
\ProcessList{#1}{\myfirst}
}
\newif\ifthisisthefirst
\newcommand{\myfirst}[1]{
\ifthisisthefirst
\setlength{\mylength}{#1}
\thisisthefirstfalse
\fi
}
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}\par
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}
\end{document}
该宏\mylengthlist
获取以逗号分隔的长度列表(一个或多个)并将其设置\mylength
为第一个项的值。
不幸的是,我认为我为了得到第一件物品做了太多的处理。
我尝试使用该包xstring
,但是我得到的结果却不被识别为长度\setlength
。
我希望有人能帮助我找到更好的解决方案。
答案1
这是一行代码expl3
:
\documentclass[12pt,a4paper]{article}
\newlength{\mylength}
\ExplSyntaxOn
\NewDocumentCommand{\mylengthlist}{m}
{
\setlength{\mylength}{ \clist_item:nn { #1 } { 1 } }
}
\ExplSyntaxOff
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}
\end{document}
奖励:您可以添加可选参数并选择要使用的列表项。
\documentclass[12pt,a4paper]{article}
\newlength{\mylength}
\ExplSyntaxOn
\NewDocumentCommand{\mylengthlist}{O{1}m}
{
\setlength{\mylength}{ \clist_item:nn { #2 } { #1 } }
}
\ExplSyntaxOff
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}
\mylengthlist[2]{0.8\textwidth, 2cm, 10pt}
Test 3: \rule{\mylength}{1pt}
\end{document}
答案2
\documentclass{article}
\newlength\mylength
\def\mylengthlist#1{\afterassignment\zmylengthlist\mylength#1!}\def\zmylengthlist#1!{}
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}\par
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}
\end{document}
\end{document}
答案3
\documentclass{article}
\newlength\mylength
\newcommand\mylengthlist[1]{\mllaux#1,\relax}
\def\mllaux#1,#2\relax{\setlength\mylength{#1}}
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}\par
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}
\end{document}
如果您想要一个可选参数来指定使用列表中的长度,则可以这样做:
\documentclass{article}
\newlength\mylength
\newcommand\mylengthlist[2][1]{\iftrue\mllaux{#1}#2,\fi}
\def\mllaux#1#2,#3\fi{\fi\ifnum#1=1 \setlength\mylength{#2}%
\else\expandafter\mllaux\expandafter{\numexpr#1-1}#3\fi}
\begin{document}
\mylengthlist{2in, 2cm, 10pt}
Test 1: \rule{\mylength}{1pt}\par
\mylengthlist{0.8\textwidth, 2cm, 10pt}
Test 2: \rule{\mylength}{1pt}\par
\mylengthlist[2]{0.8\textwidth, 2cm, 10pt}
Test 3: \rule{\mylength}{1pt}
\end{document}