人们可能会这样回答这个问题:“你到底为什么要这么做?!”,这有点像一个实验。
我正在寻找一种以“自然”方式编写具有多层嵌套的列表(学校笔记)的方法。以前,我使用复杂的 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}
答案3
这有点不同,而是使用两个命令,一个用于缩小段落,另一个用于加宽段落。我使用了\i
, \w
。第一个命令使段落变窄(即缩进但去掉无点的 i 和第二个\w
for更宽的。
\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}
}
也许某些拥有更高代码能力的人可以使用主动角色来完成这项工作,而不是像我一样使用基于环境的笨拙方式。