带有缩进的新行上显示的字符串数组

带有缩进的新行上显示的字符串数组

我希望在 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}

得出的结果是:

在此处输入图片描述

相关内容