使用缩进自动开始和结束 itemize 环境

使用缩进自动开始和结束 itemize 环境

人们可能会这样回答这个问题:“你到底为什么要这么做?!”,这有点像一个实验。

我正在寻找一种以“自然”方式编写具有多层嵌套的列表(学校笔记)的方法。以前,我使用复杂的 Pandoc、LaTeX 和 Makefile 系统来生成偶尔带有 LaTeX 片段的笔记,但是,我想要一个更集成的工作流程(例如,在 Pandoc/Markdown 文件中的代码框环境中嵌入伪代码非常具有挑战性,因为 Markdown 的设计考虑了 HTML)。

如果我创造+一个活跃的角色,比如

\makeatletter
\mathchardef\@my@mathplus=\mathcode`+
\catcode`+=\active
\def{+}{\ifmmode\@my@mathplus\else\item\fi}
\mateatother

我可以写出像这样的条目

\begin{itemize}
+ one
+ two
+ three
\end{itemize}

然而,我想摆脱\begin{itemize}\end{itemize}写下这样的笔记

+ one
    + subitem one
    + subitem two
+ two
+ three

生成嵌套列表,整齐地呈现。

有没有办法实现这一点,或者我应该考虑某种预处理?(有创意且稍微疯狂的答案会受到赞赏。)

答案1

对一个疯狂问题的疯狂回答;)

\documentclass{article}

\def\+{+}

\makeatletter
\catcode`\ =12\let\@nl@space= \catcode`\ =10
\newcount\@nl@rlevel
\newcount\@nl@llevel
\@nl@llevel=-1

\def\@nl{%
  \catcode`\ =12
  \global\@nl@rlevel=0
  \futurelet\@nl@store\@nl@%
}
\def\@nl@gobble#1{\futurelet\@nl@store\@nl@}
\def\@nl@enditemize{
  \ifnum\the\@nl@rlevel<\the\@nl@llevel%
    \end{itemize}%
    \egroup%
    \expandafter\@nl@enditemize%
  \else%
    \ifnum\the\@nl@rlevel=\the\@nl@llevel\else%
       \errmessage{Error: inconsistent identation}
    \fi%
  \fi%
}
\def\@nl@{%
  \ifx\@nl@store\@nl@space%
    \global\advance\@nl@rlevel by 1
    \expandafter\@nl@gobble%
  \else%
    \catcode`\ =10
    \ifx\@nl@store+%
      \ifnum\the\@nl@rlevel>\the\@nl@llevel%
        \bgroup%
        \@nl@llevel=\the\@nl@rlevel
        \begin{itemize}%
      \fi%
      \@nl@enditemize%
      \item \expandafter\expandafter\expandafter\@gobble%
    \else%
      \ifx\@nl@store\@nl%
        \global\@nl@rlevel=-1\relax\@nl@enditemize\par
      \else\space\fi%
    \fi%
  \fi%
}

\catcode`\^^M=\active%
\AtBeginDocument{%
  \catcode`\^^M=\active%
  \let^^M=\@nl%
}%
\catcode`\^^M=5
\makeatother

\begin{document}
Some sample text.

 + foo
 + bar
   + a
   + b
     + c. A very long line
       split into multiple lines.
 + hehe

Just like nothing happened. Ha!

\+ escaped starting plus

\[\lim_{x\to\infty}\frac1x = 0\]
\end{document}

答案2

您可能需要重新定义^^M才能获得此功能。这会有些复杂。

建议你使用++来表示子项,再+++使用 来表示子子项。这样就简单多了:

\documentclass{article}

\makeatletter
\catcode`\+\active
\def\itemX{\@ifnextchar+{\subitemX}{\item}}
\def\subitemX#1{\@ifnextchar+{\subsubitemX}{\subitem}}
\def\subsubitemX#1{\subsubitem}
\def+{\ifmmode\string+\else\expandafter\itemX\fi}
\@makeother\+
\makeatother

\newenvironment{easylist}{\trivlist\item
  \def\item{\par\noindent\textbullet\enspace}%
  \def\subitem{\par\noindent\quad\textasteriskcentered\enspace\ignorespaces}%
  \def\subsubitem{\par\noindent\qquad-\enspace\ignorespaces}%
  \catcode`\+\active
}{\endtrivlist}

\begin{document}

\begin{easylist}
+ foo $a+b$
+ foo 
++ bar
++ bar
+++ baz
+++ baz
+ foo
\end{easylist}

\end{document}

也可以看看:nicetext包裹;pandoc工具。

答案3

这有点不同,而是使用两个命令,一个用于缩小段落,另一个用于加宽段落。我使用了\i, \w。第一个命令使段落变窄(即缩进但去掉无点的 i 和第二个\wfor更宽的

\documentclass{article}
\usepackage{lipsum}
\parskip12pt
\def\narrower{\advance\leftskip by\parindent
\advance\rightskip by\parindent}
\def\wider{\advance\leftskip by-\parindent
\advance\rightskip by-\parindent}


\def\w{\wider}
\def\i{\narrower}

\begin{document}
   \lipsum[1]
   \i \lipsum[2] 
   \i \lipsum[2]
   \i \lipsum[3]
   \w \lipsum[4]
   \w \lipsum[5]
   \w \lipsum[6]
\end{document}

优点,不要输入超过需要的内容!风格要适合!

答案4

我在使用 beamerposter 之前的解决方案时遇到了麻烦,所以我想出了另一个。这有点像一个临时解决方案,但它对我来说很管用,并且保留了 beamerposter 的项目符号样式:

\newcommand{\point}[1]{
\begin{itemize}
\item{#1}
\end{itemize}
}
\newcommand{\subpoint}[1]{
\begin{itemize}
\item[]
\begin{itemize}
\item{#1}
\end{itemize}
\end{itemize}
}

也许某些拥有更高代码能力的人可以使用主动角色来完成这项工作,而不是像我一样使用基于环境的笨拙方式。

相关内容