我一直在使用 vitek novotny 提供的出色的 markdown 包,但有时它有点过度,而且 lualatex 也比 pdflatex 慢。然而,即使在我的简单 latex 文档中,我确实也错过了 markdown 的一个功能,特别是在早期创作阶段,我仍在尝试拼凑我的逻辑流程:
我希望将两个正则表达式字符串\n\*\s
和\n\s+\-\s
替换为我可以指定的字符串(\noindent\rule{0pt}{20pt}$bullet$
和\hspace{4em}\rule{0pt}{16pt}$\>$
)。我不会以这种方式开始正常的段落,因此这很少会让我绊倒;如果真的绊倒了,它会立即显示出来,我可以避开它,或者当我用文本替换要点时它会消失。
在正常的乳胶字节流中进行这种即时替换也意味着我不需要\begin{markdown}\n\* ...\end{markdown}
为这个简单的任务编写代码。(shell 脚本也不可接受,因为我使用 overleaf。)
有没有一种快速而简单的方法来实现这一点?
答案1
这个修改后的答案回应了 OP 的评论,表明我的原始答案误解了这个问题(因为它得到了几个赞成票,所以我把它包含在答案的后面)。
由于 TeX 吸收行尾和后续前导空格的方式,如果不尝试其他魔法(可能使用\obeyspaces
and/or \endlinechar
),我将无法检测行上的前导空格。因此,我剩下的就是检测首字母*
或-
后面的 a \par
(无论是否有前导空格)。
我可以使用 将它们转换为项目符号和缩进级别tokcycle
。仅调用\tokencyclexpress\par
即可开始拦截/替换并\endtokencyclexpress
终止拦截/替换。
\documentclass{article}
\usepackage{tokcycle}
\newif\ifstardashcheck
\Characterdirective{%
\tctestifcon{\ifstardashcheck}
{\tctestifx{*#1}%
{\addcytoks{\noindent$\bullet$}}%
{\tctestifx{-#1}
{\addcytoks{\noindent\hspace{20pt}$>$}}%
{\addcytoks{#1}}%
}%
}%
{\addcytoks{#1}}%
\stardashcheckfalse
}
\Macrodirective{\tctestifx{\par#1}{\stardashchecktrue
\addcytoks{#1}}{\stardashcheckfalse\addcytoks{#1}}}
\begin{document}
\tokencyclexpress\par%
* bullet test 1
* bullet test 2
- indent test 1
- indent test 2
* Bullet test 3
Normal text
\endtokencyclexpress
\end{document}
原始答案(误解原帖者的意图)
\documentclass{article}
\usepackage[T1]{fontenc}
\let\s\relax
\def\compA{\*}
\def\compB{+\-\s}
\def\n#1\s{%
\def\tmp{#1}%
\ifx\compA\tmp
\def\next{\noindent\rule{0pt}{20pt}$\bullet$ }%
\else
\ifx\relax#1\relax
\def\next{\nn}%
\else
\def\next{[\detokenize{\n#1\s}] }%
\fi
\fi
\next
}
\def\nn#1#2#3{\def\tmp{#1#2#3}%
\ifx\compB\tmp
\def\next{\hspace{4em}\rule{0pt}{16pt}$>$ }%
\else
\def\next{[\detokenize{\n\s#1#2#3}] }%
\fi
\next
}
\begin{document}
Testing
\n\*\s First type.
\n\s+\-\s 2nd type.
Improperly formed
\n123\s and
\n\s+-=.
\end{document}
答案2
shell 脚本也不可接受,因为我使用 overleaf。)
这似乎是一个挑战,所以这里是在 overleaf 上运行的 perl 中实现的行首的 * -> 项目符号替换
该项目只有两个文件
tex 源代码*
位于行首
\documentclass{article}
\begin{document}
* xxx
* zzz
\end{document}
以及latexmkrc
在 tex 运行之前指定正则表达式替换的文件(\
写为以避免计算出在各个阶段需要引用^^5c
多少个。\\\\
\
$pdflatex="perl -pi -e 's/^ *[*]/^^5cpar^^5ctextbullet~/' %S; pdflatex %S"