从每个换行符中创建列表项的最简洁方法

从每个换行符中创建列表项的最简洁方法

我如何才能自动将每一行转换为列表项?

例如我希望以下内容成为一个列表(不添加更多字符):

\begin{foo}
Persian
French 
Arabic
Urdu
\end{foo}
  • 波斯语
  • 法语
  • 阿拉伯
  • 乌尔都语

答案1

如果输入的布局与您显示的完全一致,并且\begin{foo}单独\end{foo}一行,则将执行以下操作:

\documentclass{article}

\makeatletter
\newcommand{\checkForEnd}{\@ifnextchar\end{}{\item}}
\makeatother
\newenvironment{foo}
 {\par\obeylines
  \begingroup\lccode`~=`\^^M
  \lowercase{\endgroup\let~}\checkForEnd
  \begin{itemize}}
 {\end{itemize}}

\begin{document}
\begin{foo}
Persian
French
Arabic
Urdu
\end{foo}

\begin{itemize}
\item Persian
\item French
\item Arabic
\item Urdu
\end{itemize}
\end{document}

两个环境的结果将相同。但foo环境不应该出现在争论执行命令。

itemize当然,您可以借助包来修改环境的外观enumitem。例如

\usepackage{enumitem}

\newenvironment{foo}
 {\par\obeylines
  \begingroup\lccode`~=`\^^M
  \lowercase{\endgroup\let~}\checkForEnd
  \begin{itemize}[nosep]}
 {\end{itemize}}

将“消除”所有垂直空间,而noitemsep代替nosep将删除项目之间的空间,使环境与其上方和下方的文本分离。

foo您甚至可以使用以下方法为每个环境进行设置

\usepackage{enumitem}

\newenvironment{foo}[1][]
 {\par\obeylines
  \begingroup\lccode`~=`\^^M
  \lowercase{\endgroup\let~}\checkForEnd
  \begin{itemize}[#1]}
 {\end{itemize}}

这样选项就可以作为可选参数传递给foo;例如,

\begin{foo}[nosep]
Persian
French
Arabic
Urdu
\end{foo}

答案2

以下是一个选项:使用\obeylines和的“itemize定义” \everypar

在此处输入图片描述

\documentclass{article}
\newenvironment{foo}
  {\obeylines\everypar{\textbullet\hspace{\labelsep}}}% \begin{foo}
  {}% \end{foo}
\begin{document}
\begin{foo}
Persian
French 
Arabic
Urdu
\end{foo}

\begin{itemize}
\item Persian
\item French 
\item Arabic
\item Urdu
\end{itemize}
\end{document}

相关内容