我希望在 LaTex 中有类似这样的内容:
是否有一个函数可以做到这一点?否则,我希望有一个命令,我可以传递一个字符串数组,用逗号/分号分隔,然后生成上述输出;例如\createindentedtext(string1, string2, string3)
。
输出:
string1
string2
string3
那可能吗?
使用 egreg 的解决方案几乎可行。我使用的代码是
\documentclass{article}
\usepackage{xparse}
\setlength{\parindent}{0cm}
\setlength{\parskip}{8pt}
\ExplSyntaxOn
\NewDocumentCommand{\createindentedlist}{m}
{
\group_begin:
\skip_zero:N \parskip
\skip_set:Nn \parindent { 1.5em }
\par\medskip
\cil_iterate:n { #1 }
\medskip
\group_end:
}
\cs_new_protected:Npn \cil_iterate:n #1
{
\int_set:Nn \cil_iteration_int { 0 } % 0 = first line gets indented; -1 = skip first line
\clist_map_inline:nn { #1 }
{
\hspace*{\cil_iteration_int \parindent} \textsf{##1}
\int_incr:N \cil_iteration_int
\par\nobreak
}
}
\int_new:N \cil_iteration_int
\ExplSyntaxOff
\begin{document}
\section*{Section}
\createindentedlist{string1,string2,string3}
\end{document}
无论我是否忽略第一个字符串(0 或 -1),缩进都会有点偏离。
是否可以为除第一个字符串之外的所有字符串插入符号?因此它看起来像这样:
答案1
以下是一种方法:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\createindentedlist}{m}
{
\par\medskip
\cil_iterate:n { #1 }
\medskip
}
\cs_new_protected:Npn \cil_iterate:n #1
{
\int_set:Nn \cil_iteration_int { -1 }
\clist_map_inline:nn { #1 }
{
\hspace*{\cil_iteration_int \parindent} \textsf{##1}
\int_incr:N \cil_iteration_int
\par\nobreak
}
}
\int_new:N \cil_iteration_int
\ExplSyntaxOff
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\createindentedlist{string1,string2,string3}
\lipsum[2]
\end{document}
第一项不会缩进;如果您希望缩进,请更改-1
为。我在要排版的条目周围添加了,以显示我们正在设置格式。0
\textsf
如果您正在使用parskip
包(或手动设置\parskip
并使用零\parindent
),请将第一个定义更改为
\NewDocumentCommand{\createindentedlist}{m}
{
\group_begin:
\skip_zero:N \parskip
\skip_set:Nn \parindent { 1.5em }
\par\medskip
\cil_iterate:n { #1 }
\medskip
\group_end:
}
在章节开头使用此命令有所不同,因为第一段的处理有些特殊:你可以尝试
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\createindentedlist}{m}
{
\parbox{\textwidth}{
\skip_zero:N \parskip
\skip_set:Nn \parindent { 1.5em }
\cil_iterate:n { #1 }
\medskip
}
}
\cs_new_protected:Npn \cil_iterate:n #1
{
\int_set:Nn \cil_iteration_int { -1 }
\clist_map_inline:nn { #1 }
{
\hspace*{\cil_iteration_int \parindent} \textsf{##1}
\int_incr:N \cil_iteration_int
\par\nobreak
}
}
\int_new:N \cil_iteration_int
\ExplSyntaxOff
\usepackage{lipsum}
\begin{document}
\section{Title}
\createindentedlist{string1,string2,string3}
\lipsum[2]
\end{document}
答案2
您还可以使用pgf
的\foreach
宏来遍历列表并在每次迭代时增加水平缩进,然后使用来tikz
添加行。
为了更容易控制每个列表成员的格式,我为第一个、中间和最后一个列表成员定义了三个不同的命令:
\newcommand*{\FormatFirstListMember}[1]{\textcolor{magenta}{\texttt{#1}}}%
\newcommand*{\FormatMiddleListMember}[1]{\textcolor{blue}{\texttt{#1}}}%
\newcommand*{\FormatLastListMember}[1]{\texttt{#1}}%
使用上述设置后,使用结果如下:
\createindentedtext{java.lang.Object, java.awt.Component3, java.awt.Container, javax.swing.JComponent}
\createindentedtext[50pt]{java.lang.Object, java.awt.Component3, java.awt.Container, javax.swing.JComponent}
笔记:
- 可选的第一个参数
\createindentedtext
可用于覆盖缩进量的默认设置。默认值是 中指定的值\DefaultIndentSize
。 - 可以修改
\FormatFirstListMember
、\FormatMiddleListMember
、\FormatLastListMember
来调整要应用于列表成员的所需格式。 - 您可以调整设置来
\ConnectIndentedText
调整线条的格式。 - 连接元素的垂直线的当前设置被设置为缩进大小的一半。这可以通过更改
0.5
定义中的常量来根据需要进行调整\ConnectIndentedText
。也可以将其调整为始终位于特定字母(例如v
)下java
,方法是将此宏中的值替换为使用中的-0.5*#1
适当表达式\widthof{}
包裹calc
(与加载的内容不同\usetikzlibrary{calc}
)。 - 包裹
showframe
用于显示文本相对于边距的位置。 确保\noindent
您的文本相对于边距移动。 - 这需要运行两次。第一次用于确定线条的终点,第二次用于绘制线条。
代码:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{xstring}
\usepackage{showframe}
\usetikzlibrary{calc}
\newlength{\DefaultIndentSize}%
\setlength{\DefaultIndentSize}{25pt}% adjust to suit
% Specify the formatting of each of the list members
\newcommand*{\FormatFirstListMember}[1]{\textcolor{magenta}{\texttt{#1}}}%
\newcommand*{\FormatMiddleListMember}[1]{\textcolor{blue}{\texttt{#1}}}%
\newcommand*{\FormatLastListMember}[1]{\texttt{#1}}%
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\ConnectIndentedText}[2][\DefaultIndentSize]{%
\begin{tikzpicture}[overlay, remember picture]
\draw [thick, blue]
($(#2)+(0,0.5ex)$) --
($(#2)+(-0.5*#1,0.5ex)$) --
($(#2)+(-0.5*#1,2.0ex)$)
;
\end{tikzpicture}
}%
\newcounter{TotalNumberOfListMembers}%
\newcommand{\SetTotalNumberOfListMembers}[1]{%
\setcounter{TotalNumberOfListMembers}{0}%
\foreach \member in {#1} {%
\stepcounter{TotalNumberOfListMembers}%
}%
}%
\newlength{\IndentLength}%
\newcounter{CurrentListMemberCount}%
\newtoggle{FirstIndentedText}%
\newcommand*{\createindentedtext}[2][\DefaultIndentSize]{%
\setlength{\IndentLength}{0pt}%
\SetTotalNumberOfListMembers{#2}%
\setcounter{CurrentListMemberCount}{0}%
\global\toggletrue{FirstIndentedText}%
\foreach \member in {#2} {%
\stepcounter{CurrentListMemberCount}%
\par\noindent\hspace*{\IndentLength}%
\tikzmark{start}%
\iftoggle{FirstIndentedText}{%
\FormatFirstListMember{\member}%
}{%
\IfEq{\the\value{CurrentListMemberCount}}{\the\value{TotalNumberOfListMembers}}{%
\FormatLastListMember{\member}%
}{%
\FormatMiddleListMember{\member}%
}%
\ConnectIndentedText[#1]{start}%
}%
\global\addtolength{\IndentLength}{#1}%
\global\togglefalse{FirstIndentedText}%
}%
}%
\begin{document}
\createindentedtext{java.lang.Object, java.awt.Component3, java.awt.Container, javax.swing.JComponent}
\bigskip
\createindentedtext[50pt]{java.lang.Object, java.awt.Component3, java.awt.Container, javax.swing.JComponent}
\end{document}
答案3
一个可能的解决方案是:
\documentclass{article}
\makeatletter
\newlength\CurrIndent
\newcommand\IndentedList[1]{\setlength\CurrIndent{0cm}\par\noindent%
\expandafter\Indented@List#1,,\@nil}
\def\Indented@List#1,#2,#3\@nil{%
\hspace*{\CurrIndent}\texttt{#1}%
\ifx\relax#2\relax\par\else\newline
\addtolength\CurrIndent{1cm}\Indented@List#2,#3\@nil\fi}
\makeatother
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\IndentedList{string1,string2,string3}
\lipsum[2]
\end{document}
得出的结果是: