我如何才能自动将每一行转换为列表项?
例如我希望以下内容成为一个列表(不添加更多字符):
\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}