@ifnextchar 之后该怎么做?

@ifnextchar 之后该怎么做?

在我的 LaTeX 文件中,我使用\usepackage{indentfirst}

我在那里定义了一个命令:

% ################################################## %
% Coding skills
% ---------- Usage example ----------
% \codingskills{Fortran}{C}{Java}{Kotlin}{Swift}
% ################################################## %
\def\codingskills#1{\faCode\space#1\@ifnextchar\bgroup{\iteratenextskill}{, etc.}}
\def\iteratenextskill#1{, #1\@ifnextchar\bgroup{\iteratenextskill}{, etc.}}

\codingskills{Java}{JavaScript}{Python}{Ruby}{C}{C++}{C\#}{RESTful API}{gRPC}{Microservice}{Latex}{Fortran}{Go}{Erlang}{Elixir}{Haskell}{Rust}{R}

这将按照我的期望输出内容,如下所示:

带缩进

但是,我想对齐所有行的缩进。所以我尝试\noindent\setlength{\leftskip}{1.5em}在之前添加并在之后重置长度。之前代码中的 setlength 运行顺利,但\setlength{\leftskip}{0em}之后代码中的 reset() 完全破坏了一切。因为它已被作为 的一部分(解析)@ifnextchar。下面是代码片段,我只是用它{!!!!!}来演示解析问题:我想{!!!!!}在此命令的末尾解析(即在最后执行重置长度处理),但不是在迭代第一个参数之后立即解析。

\def\codingskills#1{\noindent\setlength{\leftskip}{1.5em}\faCode\space#1\@ifnextchar\bgroup{\iteratenextskill}{, etc.}{!!!!!}}
\def\iteratenextskill#1{, #1\@ifnextchar\bgroup{\iteratenextskill}{, etc.}}

在此处输入图片描述

有人能帮我告诉我应该把重置后的长度代码放在哪里吗?提前谢谢了。

我试过把它放到末尾iteratenextskill,结果更糟。block 也试过了\newenvironment,效果和上面的截图一样。

答案1

您必须将\setlength指令包含在 的第二个参数中\@ifnextchar,但您需要\par在其前面添加一个,否则您的指令\setlength{\leftskip}{1.5em}不会产生效果。因此,您可以使用:

\def\codingskills#1{\noindent\setlength{\leftskip}{1.5em}\faCode\space#1\@ifnextchar\bgroup{\iteratenextskill}{, etc.\par\setlength{\leftskip}{0pt}}}
\def\iteratenextskill#1{, #1\@ifnextchar\bgroup{\iteratenextskill}{, etc.\par\setlength{\leftskip}{0pt}}

出于某些我不太确定的原因,我会对宏进行稍微不同的构造(一个参数是没有重复的代码):

\documentclass[]{article}

\def\faCode{\textless/\textgreater}

\makeatletter
\newcommand*\codingskills[1]
  {%
    \par\noindent\setlength{\leftskip}{1.5em}\faCode\space#1\iteratenextskill
  }
\newcommand*\iteratenextskill
  {%
    , \@ifnextchar\bgroup{\iteratenextskill@}{\endskill}%
  }
\newcommand*\iteratenextskill@[1]
  {%
    #1\iteratenextskill
  }
\newcommand*\endskill
  {%
    etc.\par\setlength{\leftskip}{0pt}%
  }
\makeatother

\begin{document}
\codingskills{Java}{JavaScript}{Python}{Ruby}{C}{C++}{C\#}{RESTful
API}{gRPC}{Microservice}{Latex}{Fortran}{Go}{Erlang}{Elixir}{Haskell}{Rust}{R}
\end{document}

在此处输入图片描述

但请注意,采用任意多个带括号参数的接口是不受欢迎的,因此我改用逗号分隔的列表作为输入,您可以在第二个参数中指定其他格式\clist_map_inline:nn,请注意,在范围内的\ExplSyntaxOn空格会被忽略并且~是一个空格。

\documentclass[]{article}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \codingskills { m }
  {
    \tex_par:D
    \tex_noindent:D
    \dim_set:Nn \leftskip { 1.5em }
    \faCode
    \clist_map_inline:nn { #1 } { ~ ##1, } ~ etc.
    \tex_par:D
    \dim_set:Nn \leftskip { 0pt }
  }
\ExplSyntaxOff

\def\faCode{\textless/\textgreater}

\begin{document}
\codingskills{Java, JavaScript, Python, Ruby, C, C++, C\#, RESTful
API, gRPC, Microservice, Latex, Fortran, Go, Erlang, Elixir, Haskell, Rust, R}
\end{document}

相关内容