应用场景大概是这样:
我想对一些笔记、记录等内容进行分类,不同领域(比如专业课、CS、其他爱好的)就不放在一起了,有长期保存需要的,专门归纳排版作为手册供查询。编写和记录的时候,越简洁明了越好,长期保存的内容,还是尽量美观一点,目前能想到适合的流程是:用markdown进行最初的编辑,设置好固定的tex模板定期跑出PDF保存。
问题主要是:
我是希望全程在Emacs中操作的,整个流程主要卡在从.md到.tex这一步。
遇到到问题大概分两种,
一些从md转成的tex文件在终端中编译,正常显示中文;在Emacs中直接输出却不行。大概原因是:因为插入了其他语言的代码,所以我用的是polymode(如.Rmd文件),使用polymode-export命令进行输出,在此过程中,无论polymode所调用的exporter是markdown(knitr)还是pandoc,最终都是使用pandoc进行转换,由于pandoc仅使用latex命令,故直接编译unicode文档可能报错。终端中正常,是因为直接使用了xelatex(或xetex),根据设置调用了ctex宏集编译。
从md转换的tex文件,即使用latex/xetex/xelatex编译,也多多少少会有一些问题。只保留大致的文档结构,在主tex头部单独设置\documentclass和\usepackage等,再在终端里编译,也不能完全解决,总会遇到一些问题需要调试。
还有一个问题是默认的fandol字体,应该可以归并到问题1中。
讨论和请教
从markdown这一类标记性的记录,转换到tex(pdf),有没有好的工作流程?
我也想过直接写.tex文档,语法倒不是最主要的问题,设置也可以从当年的论文源文件改改拿过来用,但书写的过程总是麻烦一些,相比markdown更容易因为调试而打断思路。总之还是想优先打通md到tex的桥梁。
我认为问题的核心并不是文档格式的转换。各位能否提供更好的解决思路?
谢谢!
其他要说明的:
org-mode略笨重,就我的日常使用来说跟markdown也有很多功能重复之处;
md直接输出为html也是一条能走通的路,但是相当于又涉及一种新的语法。
不到不得已,我也不想再引入上述这俩工具。
LdBeth
2025 年10 月 13 日 06:01
2
pandoc 对中文支持烂,而且对 LaTeX 的输入输出都做得不够专业,不建议用
你自己 TeX 水平不是很高的话,我也不建议去用 TeX 整中文支持,或是整什么自动转换到 TeX 的路径
我的建议是学点 CSS,AI 辅助写个 CSS style,导出markdown到HTML,然后用这个
5 个赞
楼上在这一块远比我专业,就不对楼上的 approach 做评价了。
我只想说关于 rmarkdown + knitr + pandoc 这一步工作流。我上学的时候使用 rmarkdown 用 pandoc 导出成 latex 这个工作流很多年了,从来没遇到过中文显示的问题。你是用了什么特殊的宏包吗?
SPQR
2025 年10 月 13 日 06:34
4
有意思,这个东西能代替docbook xml吗?如果只是导出用来导出markdown渲染成pdf用的话
我也是用上学时候的代码,隔了几年Linux发行版和texlive的版本变了。
以前的tex还能跑得动,但是Rmd不能直接用了。如今LaTeX成了鸡肋,深入学吧日常用处不够多,扔了又可惜……
我看有人遇到类似的问题:只在RStudio运行没问题,其他时候不能成功调用xelatex,还是会自动选取latex或pdflatex,所以会遇到不同语言编码和字体的问题。
LdBeth
2025 年10 月 13 日 08:11
6
其实 DocBook XML 本身也并不能渲染文本,如果不花钱去买很贵的 XSL-FO 排版器也可以出 HTML 用这个作为平替
然后我自己是不写 markdown 的,而是用预处理器自定义缩写来写HTML,长期保存的文章还是用 DocBook
2 个赞
虽然你不想用 org, 但我导出org到pdf都是用tex作为中间输出的,可以很方便的配置使用xetex。所以可以尝试用 md 转成 org, 再导出pdf.
我之前翻译一些小册子的时候用的是md→pdf方案,先对md用shell脚本做点预处理,然后再交给pandoc,最后再用pdftk修一修。细节处理要调pandoc参数,自己写tex脚本实现具体参数控制。你不想自己折腾tex的话,很多功能只靠pandoc是做不了的。
你要是只想md格式化输出,typora整挺好的,还支持用css样式定制,唯一缺点是不免费(我被贫穷胁迫从了pandoc,苦也)。这方面不知道有无现成开源库可用。
我不排斥用tex,细节用tex反而更美观和可控,主要想把\begin\end{document}之间的部分,比如\section和\frame{}\block{}这样的命令,交给更便捷的markdown。
typora就不考虑了,能用emacs解决的尽量就不用别的了。
1 个赞
这是我的脚本:
#!/usr/bin/sh
# use pandoc and xelatex
mymd2pdf(){
echo "printing $1 ..."
pandoc $1\
--from markdown+smart+tex_math_dollars-blank_before_header+link_attributes\
--to pdf\
--strip-comments\
-s --toc --toc-depth=6\
--pdf-engine=xelatex \
-V documentclass=book \
-V geometry:b5paper \
-V mainfont="Linux Libertine"\
-V CJKmainfont="LXGW WenKai"\
-V colorlinks=true\
--highlight-style pygments\
-H head.tex\
-o prints/${1%.md}.pdf
}
# default output index
if [ ! -d prints ]
then
mkdir prints
fi
case $1 in
-f) # print a specific file
if [ -f $2 ]
then
mymd2pdf $2
else
echo "file $2 does not exist"
fi
;;
-d) # print all files in a directory
if [ -d $2 ]
then
for i in $(find $2/*.md)
do
mymd2pdf $i
done
else
echo "directory $2 does not exist"
fi
;;
*) # show a help
echo "by default it reads from stdin."
echo "-f [file] print a file"
echo "-d [directory] print a directory"
esac
pandoc选项可以自行调整,在head.tex文件里面定制其它tex格式(比如布局、页眉页脚、代码美化、自动换行等)。我遇到过的问题是指定字体可能缺字符,这个问题我没有去找解决方案。
2 个赞
tumashu:
ctex
已经在用ctex宏集了,在终端运行也没问题。
我的想法是尽量少一个环节,将来需要额外调试的可能也许就少一分。直接从emacs里执行的话,不同的方式最终调用的tex engine都是latex,这就给直接处理中文埋雷了。不过这也不算tex本身的问题,毕竟这些玩意儿多是欧美人在用,在Emacs上同时用md、tex、还需要处理中文的概率想想也不会高,我自己目前也没能力解决更底层的调用问题,就先在坛子里问问。
你在终端运行没问题为什么在 emacs 里面运行会有问题?你可以不用 polymode-export 直接设置一个 compile mode 的编译命令,用你在终端能够编译通过一样的命令就行了。
texlive 确实很烦,一年一个版本,每次新版都是10g级别的巨大的包,而且确实经常有破坏性的升级。texlive 还是在容器里运行比较好,写个简单的 wrapper 每次运行的时候把项目目录挂载进去用。
RnE
2025 年10 月 14 日 06:09
15
TeXLive 可以不用 full install,之后缺的包用 tlmgr 装。
或者用 plain-TeX 和 ConTeXt,都有小的多的发行版。
1 个赞
SPQR
2025 年10 月 14 日 07:40
16
我就是这么干的,但是一年一度的大版本更新还是有点烦,如果texlive能全部滚动更新就好了
milan-glacier:
为什么在 emacs 里面运行会有问题?
在emacs里运行默认通过pandoc调用的是latex,终端里自己选的是xelatex(xetex)
我试试能不能写个编译命令……
RnE
2025 年10 月 15 日 10:01
19
LdBeth:
可以研究一下从源码编译TeX
补充一些细节。
LuaTeX,XeTeX,pdfTeX 这些引擎都是在 TeXLive 的树内编译比较方便,而且无构建系统之外依赖(HarfBuzz 这些都在树内)。
对编译比较有用的细节:
有一个叫 Kpathsea 的东西,控制了 TeX 和周边生态的文件读取。在编译引擎的时候需要一个叫 texmf.in 的文件(会被转换成 Kpathsea 的 C 头文件,然后链接到引擎里)。Kpathsea 在运行时也会去读 texmf.cnf 的文件。关于这个东西怎么写,可以看 TeXLive 的,注释和选项都很写的非常清楚。
关于怎么用 virgin TeX dump 出一个 .fmt 文件。建议看一下相关的 TeX 书(不是 LaTeX)。不说 LaTeX,就算是比较简洁的 plain-TeX,现代的 Unicode-aware 的引擎实际上也需要一些额外的文件,比如 LuaTeX 的话需要:
plain.tex; hyphen.tex /macros/plain/base
etex.src; etexdefs.lib /systems/e-tex/v2/src
pdftexconfig.tex /macros/generic/tex-ini-files
luatex.ini; luatexconfig.tex; luatexiniconfig.tex /macros/generic/tex-ini-files
load-unicode-data.tex /macros/generic/unicode-data
关于字体。如果你不希望依赖 metafont 和一些周边工具,你需要确保你用的格式里的字体都是有 Type1 字体文件和 TeX font metric 文件,以及映射表 <engine>.map 的。
所以实际上脏活累活 TeXLive 的维护者都帮我们做好了,感谢他们。
2 个赞
LdBeth
2025 年10 月 15 日 17:11
20
主要实现是 web2c,kpathsea是它的配件,pdftex,luatex啥的都是在web2c上打补丁实现的
当然如果不选web2c,也可以选kertex
放以前web2c也是很清淡的,连IBM S360上都有看到它,现在就有了比较多的外部依赖。kertex主打的是在能运行最新版本的LaTeX的前提下对OS的要求越简单越好,配的还是dvips
真要原汁原味的TeX就是直接用Pascal编译器,LaTeX2.09往上就没法支持了,而且需要的文件都得在当前路径下
ptex-ng 就实际上是在纯C重新写出来的Y&Y TeX 上改出来的,也可以不依赖kpathsea
1 个赞