请教一下md转tex的思路

应用场景大概是这样:

我想对一些笔记、记录等内容进行分类,不同领域(比如专业课、CS、其他爱好的)就不放在一起了,有长期保存需要的,专门归纳排版作为手册供查询。编写和记录的时候,越简洁明了越好,长期保存的内容,还是尽量美观一点,目前能想到适合的流程是:用markdown进行最初的编辑,设置好固定的tex模板定期跑出PDF保存。

问题主要是:

我是希望全程在Emacs中操作的,整个流程主要卡在从.md.tex这一步。 遇到到问题大概分两种,

  1. 一些从md转成的tex文件在终端中编译,正常显示中文;在Emacs中直接输出却不行。大概原因是:因为插入了其他语言的代码,所以我用的是polymode(如.Rmd文件),使用polymode-export命令进行输出,在此过程中,无论polymode所调用的exporter是markdown(knitr)还是pandoc,最终都是使用pandoc进行转换,由于pandoc仅使用latex命令,故直接编译unicode文档可能报错。终端中正常,是因为直接使用了xelatex(或xetex),根据设置调用了ctex宏集编译。
  2. 从md转换的tex文件,即使用latex/xetex/xelatex编译,也多多少少会有一些问题。只保留大致的文档结构,在主tex头部单独设置\documentclass\usepackage等,再在终端里编译,也不能完全解决,总会遇到一些问题需要调试。

还有一个问题是默认的fandol字体,应该可以归并到问题1中。

讨论和请教

从markdown这一类标记性的记录,转换到tex(pdf),有没有好的工作流程?

我也想过直接写.tex文档,语法倒不是最主要的问题,设置也可以从当年的论文源文件改改拿过来用,但书写的过程总是麻烦一些,相比markdown更容易因为调试而打断思路。总之还是想优先打通md到tex的桥梁。

我认为问题的核心并不是文档格式的转换。各位能否提供更好的解决思路?

谢谢!

其他要说明的:

org-mode略笨重,就我的日常使用来说跟markdown也有很多功能重复之处; md直接输出为html也是一条能走通的路,但是相当于又涉及一种新的语法。 不到不得已,我也不想再引入上述这俩工具。

pandoc 对中文支持烂,而且对 LaTeX 的输入输出都做得不够专业,不建议用

你自己 TeX 水平不是很高的话,我也不建议去用 TeX 整中文支持,或是整什么自动转换到 TeX 的路径

我的建议是学点 CSS,AI 辅助写个 CSS style,导出markdown到HTML,然后用这个

5 个赞

楼上在这一块远比我专业,就不对楼上的 approach 做评价了。

我只想说关于 rmarkdown + knitr + pandoc 这一步工作流。我上学的时候使用 rmarkdown 用 pandoc 导出成 latex 这个工作流很多年了,从来没遇到过中文显示的问题。你是用了什么特殊的宏包吗?

有意思,这个东西能代替docbook xml吗?如果只是导出用来导出markdown渲染成pdf用的话

我也是用上学时候的代码,隔了几年Linux发行版和texlive的版本变了。

以前的tex还能跑得动,但是Rmd不能直接用了。如今LaTeX成了鸡肋,深入学吧日常用处不够多,扔了又可惜…… :rofl:

我看有人遇到类似的问题:只在RStudio运行没问题,其他时候不能成功调用xelatex,还是会自动选取latexpdflatex,所以会遇到不同语言编码和字体的问题。

其实 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 个赞

中文的话,可以研究研究 ctex 包,省很多事

已经在用ctex宏集了,在终端运行也没问题。

我的想法是尽量少一个环节,将来需要额外调试的可能也许就少一分。直接从emacs里执行的话,不同的方式最终调用的tex engine都是latex,这就给直接处理中文埋雷了。不过这也不算tex本身的问题,毕竟这些玩意儿多是欧美人在用,在Emacs上同时用md、tex、还需要处理中文的概率想想也不会高,我自己目前也没能力解决更底层的调用问题,就先在坛子里问问。

你在终端运行没问题为什么在 emacs 里面运行会有问题?你可以不用 polymode-export 直接设置一个 compile mode 的编译命令,用你在终端能够编译通过一样的命令就行了。

texlive 确实很烦,一年一个版本,每次新版都是10g级别的巨大的包,而且确实经常有破坏性的升级。texlive 还是在容器里运行比较好,写个简单的 wrapper 每次运行的时候把项目目录挂载进去用。

TeXLive 可以不用 full install,之后缺的包用 tlmgr 装。

或者用 plain-TeX 和 ConTeXt,都有小的多的发行版。

1 个赞

我就是这么干的,但是一年一度的大版本更新还是有点烦,如果texlive能全部滚动更新就好了

可以研究一下从源码编译TeX

在emacs里运行默认通过pandoc调用的是latex,终端里自己选的是xelatex(xetex) :joy:

我试试能不能写个编译命令……

补充一些细节。

LuaTeX,XeTeX,pdfTeX 这些引擎都是在 TeXLive 的树内编译比较方便,而且无构建系统之外依赖(HarfBuzz 这些都在树内)。

对编译比较有用的细节:

  1. 有一个叫 Kpathsea 的东西,控制了 TeX 和周边生态的文件读取。在编译引擎的时候需要一个叫 texmf.in 的文件(会被转换成 Kpathsea 的 C 头文件,然后链接到引擎里)。Kpathsea 在运行时也会去读 texmf.cnf 的文件。关于这个东西怎么写,可以看 TeXLive 的,注释和选项都很写的非常清楚。
  2. 关于怎么用 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  
  1. 关于字体。如果你不希望依赖 metafont 和一些周边工具,你需要确保你用的格式里的字体都是有 Type1 字体文件和 TeX font metric 文件,以及映射表 <engine>.map 的。

所以实际上脏活累活 TeXLive 的维护者都帮我们做好了,感谢他们。

2 个赞

主要实现是 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 个赞