在我的 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}