ORG 代码块内的中文注释,能在PDF中输出吗?我用的xelatex

#+LATEX_HEADER: \usepackage{fontspec}
#+LATEX_HEADER: \usepackage[left=2.00cm, right=2.00cm, top=2.00cm, bottom=2.00cm]{geometry}
#+LATEX_HEADER: \setmainfont{KaiTi}
#+LATEX_HEADER: \XeTeXlinebreaklocale "zh"
#+LATEX_HEADER: \XeTeXlinebreakskip = 0pt plus 1pt
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \onehalfspacing
#+LATEX_HEADER: \XeTeXinterchartokenstate=1

* 中文测试
** as;df啊上了飞机公司啊打工i阿斯弗阿斯弗哦热i啊大家发了
\circ\\
^sf\\
\shy\\
\asciicirc\\
$asfl
#+NAME: translate
#+BEGIN_SRC perl :results value :exports results both
my $todolist="GOTO  /  -71.42857,  -16.00000,  -49.48717,-0.866025, 0.000000,-0.500000";
$todolist !~ tr/A-Z/a-z/; 
#表示将变量todolist 中的所有大写字母转化为小写字母,如果转化发生了则返回 "0",否则返回 "1"。
return "$todolist"
#+END_SRC

啥都正常,有时候表格里输出不正常,有时候代码块中的不正常,有没有方法破啊。 到处搜答案,未果,还是求助老师吧。

应该是转 PDF 的时候中文字体/编码出了问题,不是 org-mode 没有输出。

1 个赞

谢啦,倒是没有注意使用你告诉的方法分析一下,我看看我的tex文件也是。

确实已经输出 ,看来今后要多方分析,才能找到原因,谢谢指教。 开始以为与#号有关,结果不是。看来不能自以为啊。org相当完善了啊。

这样配置就解决了。

#+LATEX_CLASS: ctexart
#+LATEX_HEADER: \usepackage{fontspec}
#+LATEX_HEADER: \usepackage[left=2.00cm, right=2.00cm, top=2.00cm, bottom=2.00cm]{geometry}
#+LATEX_HEADER: \setmainfont{KaiTi}
#+LATEX_HEADER: \XeTeXlinebreaklocale "zh"
#+LATEX_HEADER: \XeTeXlinebreakskip = 0pt plus 1pt
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \onehalfspacing
#+LATEX_HEADER: \XeTeXinterchartokenstate=1
* 中文测试
** as;df啊上了飞机公司啊打工i阿斯弗阿斯弗哦热i啊大家发了
\circ\\
^sf\\
\shy\\
\asciicirc\\
$asfl
LATEX_HEADER: \usepackage{mylinuxfonts}
#+NAME: translate
#+BEGIN_SRC perl :results value :exports results both
my $todolist="GOTO  /  -71.42857,  -16.00000,  -49.48717,-0.866025, 0.000000,-0.500000";
$todolist !~ tr/A-Z/a-z/; #表示将变量todolist 中的所有大写字母转化为小写字母,如果转化发生了则返回 "0",否则返回 "1"。
return "$todolist"
#+END_SRC

希望碰到相同问题的朋友有用。

2 个赞

只标示出差异部分,让别人更快聚焦问题所在,例如以下是我的修改(macOS + texlive):

⋊> diff -U0 old.org new.org
--- old.org    2017-11-20 16:17:53.000000000 +0800
+++ new.org    2017-11-20 16:20:03.000000000 +0800
@@ -3 +3,2 @@
-#+LATEX_HEADER: \setmainfont{KaiTi}
+#+LATEX_HEADER: \usepackage{xeCJK}
+#+LATEX_HEADER: \setCJKmainfont{STKaiti}

1 个赞

谢提醒,事实上,感觉

#+LATEX_CLASS: ctexart

起了作用,因为开始的时候,我就有了。

\setmainfont{KaiTi}

但是不能显示。 我使用你的类似方法实现了中英文分别设置了字体,在文档中可以**实现英文等宽字,和中文字体的分别设置**。感觉还蛮有用的,给需要的人参考。下面是我最新的配置。

OS=windows server 2016,
emacs=25.3
latex=MikTex2.9

org文件开头放入以下字串:

#+LATEX_CLASS: ctexart
#+LATEX_HEADER: \usepackage{graphicx}
#+LATEX_HEADER: \usepackage{amsmath}
#+LATEX_HEADER: \usepackage{fontspec,xunicode, xltxtra}
#+LATEX_HEADER: \usepackage{xeCJK}
#+LATEX_HEADER: \setCJKmainfont{KaiTi}  % 中文的字体为楷体
#+LATEX_HEADER: \setmainfont{Source Code Pro}  % 英文字体使用
#+LATEX_HEADER: \usepackage[left=2.00cm, right=2.00cm, top=2.00cm, bottom=2.00cm]{geometry}
#+LATEX_HEADER: \XeTeXlinebreaklocale "zh"
#+LATEX_HEADER: \XeTeXlinebreakskip = 0pt plus 1pt
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \onehalfspacing
#+LATEX_HEADER: \XeTeXinterchartokenstate=1

根据我的测试,只需要以下最简配置就行。连 XeCJK 包都不需要。

https://macplay.github.io/posts/xetex-de-zhong-wen-hua-she-zhi/

ctexart 看网上一些评论说,也是过时的。不推荐使用。

谢指教,空了试验一下。不知道能不能中英文单独设置字体。当然喜欢简单设置,一步搞定。现在文章越来越大,编译越来越慢了。看来后面要折腾分章了,不知道还要产生多少坑。

中英文单独设置字体有时候会显得不协调。我的做法是直接选用字符集大的字体,同时包含中英文的那种。这样下来,选择范围急剧缩窄。

另外一个纠结点在于:代码块我们肯定希望优先使用等宽字体。但有时代码块中也会包含中文,而中文压根没等宽这个概念。这时你去指定一个等宽字体,肯定要编译失败。所以干脆也直接用字符集大的字体吧。

\setmonofont[Scale=0.9]{PingFang SC}

嗯,总结下来只有一条经验:不想折腾的话,就用字符集大的字体。

1 个赞

刚才无聊又用 emacs 试了下,真的不需要 XeCJKctexart。所有一切正常,包括你说的中文注释。

-#+LATEX_HEADER: \setmainfont{KaiTi}
+#+Latex_HEADER: \setmainfont{PingFang SC}
+#+Latex_HEADER: \setsansfont{Hiragino Sans GB}
+#+Latex_HEADER: \setmonofont[Scale=0.9]{PingFang SC}
 #+LATEX_HEADER: \XeTeXlinebreaklocale "zh"
 #+LATEX_HEADER: \XeTeXlinebreakskip = 0pt plus 1pt
 #+LATEX_HEADER: \usepackage{setspace}
 #+LATEX_HEADER: \onehalfspacing
-#+LATEX_HEADER: \XeTeXinterchartokenstate=1

最后删除的那行是因为不知道它干嘛用的,而且影响了文章目录正常生成。

确实,只要字体对了就能显示。但效果还是有差别的,从 log 也能看得出来,XeCJK 对中文样式/间距做了调整:

(./export-comment-in-codeblock_xecjk.toc
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsa.fd)
(/usr/local/texlive/2016/texmf-dist/tex/latex/amsfonts/umsb.fd))
(/usr/local/texlive/2016/texmf-dist/tex/latex/euenc/eu1lmtt.fd)
Overfull \hbox (22.65216pt too wide) in paragraph at lines 57--57
[]\EU1/lmtt/m/n/10.95 # \EU1/PingFangSC(1)/m/n/10.95 表 示 将 变 量 \EU1/lmtt/m/n/10
.95 todolist  \EU1/PingFangSC(1)/m/n/10.95 中 的 所 有 大 写 字 母 转 化 为 小 写 字 母 , 如 果
转 化 发 生 了 则 返 回  \EU1/lmtt/m/n/10.95 "0" \EU1/PingFangSC(1)/m/n/10.95 , 否 则 返 回
\EU1/lmtt/m/n/10.95 "1" \EU1/PingFangSC(1)/m/n/10.95 。 []
[1] (./export-comment-in-codeblock_xecjk.aux) )
(see the transcript file for additional information)
Output written on export-comment-in-codeblock_xecjk.pdf (1 page).
Transcript written on export-comment-in-codeblock_xecjk.log.

最后一行是中文断行用的。

http://linpeggy.blog.sohu.com/108446930.html

用来处理中英文间距的。像我这样排版习惯良好的人不需要这个 ◠‿◠

不仅仅是英文两侧加空格,还包括中文标点符号的压缩:

以及换行禁则,判断哪些符号不能出现在行首/尾:Line breaking rules in East Asian languages - Wikipedia

不用 XeCJK 肯定是能实现的。

嗯。确实针对中文做了不少优化。

不过最简配置对于一般场景差不多够用了。