如何获取列表中第一个元素的长度

如何获取列表中第一个元素的长度

我需要获取长度列表中的第一个长度并将其存储在变量中。

这是我目前得到的:

\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}

相关内容