免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

批量将句号改为句点

注:
1、本贴讲的是 LaTeX 下的事,与 MathJax 无关;
2、这里所讲的句号是指 “。” ,句点是指 “.” ,两者均为中文符号(全角的),而不是英文的句点。

刚才某网友向我提起《数学空间》中的句号与句点的问题,让我想起本贴中的方法。

查找与替换的功能当然是可以,但是如果一篇文章的源文件是用N个子文件来写的,那就得全部打开再替换,要是突然又说要改回来,又要再替换一次,还有那些不断有更新的文章,每次有新的文段加进来都得替换,略显麻烦。

而在 LaTeX 中,就有更简单的招式,只要在主文件的导言区加入如下两行命令即可:
  1. \catcode`\。=\active         %或者=13
  2. \newcommand{。}{.}
复制代码
意思是将句号变成活动符然后再将它定义为句点,于是切换两者就变得更加简单而且一劳永逸。

不过这里有个前提,得用 xelatex 编译,于是你应当加上 xeCJK 宏包及相应设置,而旧的 CJK 方式里这招可能不行,不过我相信现在还用旧 CJK 方式的人应该不多了。

将这招再发挥一下,还能有一个很好的用处,那就是可以让公式中的相应的中文标点不用再加 \text 或 \mbox(这在旧论坛就提及过,不过当时没具体说),命令是:
  1. \catcode`\。=\active
  2. \newcommand{。}{\ifmmode\text{.}\else .\fi}
复制代码
这样,不但句号变成句点,而且公式里还可以直接打句号,很方便。

那如果我不想改成句点,只想让公式里可以直接打句号,是不是只要将上面的“.”改成“。”就行?NO!那样会变成循环定义,解决方法是先将旧的句号储存起来再用,具体是:
  1. \let\oldjuhao=。
  2. \catcode`\。=\active
  3. \newcommand{。}{\ifmmode\text{\oldjuhao}\else\oldjuhao\fi}
复制代码
时间关系,测试文件你们自己写,我先洗漱去了。
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
$\href{https://kuingggg.github.io/}{\text{About Me}}$

PS、《数学空间》中我也不打算改成句点,我觉得句号就挺好的,以前的书中也有用句号的,而新的书都用句点大概也是为了跟国际接轨而已,我是懒得接这个轨了……
$\href{https://kuingggg.github.io/}{\text{About Me}}$

TOP

如果要换,一般正式文档都换,都是手动批量用winedt功能替换的

TOP

  1. \catcode`\。=\active
复制代码
什么意思?少他不行呢。

TOP

回复 4# isee

大概就是将句号这个字符变成“活动符”,它就像一个命令那样,但不带反斜杠(比如“~”也是),所以后面就可以将它定义成其他东西,更详细的要看 texbook,我也是大约了解一些,不是很深刻。
“~”的定义我在 texbook 里看到的也是先 \catcode`\~=\active 然后 \def~{\penalty10000\ } ,即一个不许断行的空格。(但是后来 latex 好像改过这个定义,不过意义应该没变,有空查查看)
$\href{https://kuingggg.github.io/}{\text{About Me}}$

TOP

回复 5# kuing
请教版主一个类似的问题,最近在用$\LaTeX$排版笔记时,发现行内公式与行间公式,中文环境与公式环境的逗号都不同,请问有什么办法把它们统一换成同一种逗号?
$, ,$, ,

TOP

回复 6# 大一新生

这还要看你想统一成哪种。
如果要统一为英文的逗号,那就类似于 1# 那样设就行;
但如果要统一为中文的逗号,那就不好办了,至少 1# 的方法不可行,改动英文逗号的 \catcode 必然会有副作用,至于其他方法,在这帖 http://bbs.ctex.org/forum.php?mod=viewthread&tid=80177 有过一些讨论,我也没看太懂。

TOP

回复 7# kuing
在k版主给的帖子中学了一招,代码如下(效果是将半角英文逗号改成全角中文逗号)
  1. \catcode`\,=\active\global\def,{\text{,}}
复制代码
最终在代码部分输入
1.png
2018-8-25 21:44
,编译之后得到的是
2.png
2018-8-25 21:44

但依然存在两个问题:
①中文全角逗号之后的空白太多,如果能和“a.好”中的句点后面的空白一样多就好了,不知有没有办法;
②“a.a”当句点当做小数点时,后面的空白的确应该是这样的,但是如果上一个句子以英文字母或数字结尾,下一个句子以英文字母或数字开头,那么此时句点后面的空白就应该和“a.好”里的空白一样多,这一点不知又该如何克服...

TOP

回复 8# 大一新生

这招就是上面 1# 的招啊,不过我也说了,改中文逗号为英文可以这样做,但改英文逗号为中文会有副作用,小代码没问题,但迟早会出现。

至于你那两个问题:
①如果你是在用 ctex 宏包或 ctexart 文档类,使用选项 punct=banjiao 将会使所有标点占半个汉字宽度;
②这是习惯问题,对于输入英文,你所说的情况本应很自然地手动敲一个空格,这不限于 tex,任何环境下都应该有这个习惯。

TOP

回复 9# kuing
多谢k版主!

TOP

返回列表 回复 发帖