Wrong type argument error in pst-node style of AUCTeX

Using AUCTeX 11.86 under Emacs 24.0.50.1. Activated pst-node style. Pressed C-c C-e to insert a psmatrix environment, entered nothing on “Options” and encountered the error:
let: Wrong type argument: char-or-string-p, (“”)

The “Options” can auto-complete with psmatrix options such as rowsep, colsep… Still didn’t work even if I entered something. Checked the pst-node.el under /emacs/site-lisp/auctex/style/:

;;; Environments
(defun LaTeX-pstnode-env-psmatrix (env)
  "Return psmatrix environment with arguments."
  (let ((opt (completing-read-multiple "Options: "
                                       LaTeX-pstnode-psmatrix-list)))
    (LaTeX-insert-environment env opt)))

completing-read-multiple comes from crm.el, which enables the multiple auto completion. The return value is a list instead of a string, so LaTeX-insert-environment won’t accept it. Fixed the code as follows to loop over the list and insert the option items with comma and square brackets. It doesn’t look neat but it works anyway.

;;; Environments
;;; Changed by James Lao
(defun LaTeX-pstnode-env-psmatrix (env)
  "Return psmatrix environment with arguments."
  (let ((opt (completing-read-multiple "Options: "
                                       LaTeX-pstnode-psmatrix-list)))
    (setq opto "")
    (while opt
      (if (string= opto "")
	  (setq opto (car opt))
      (setq opto (concat opto ", " (car opt))))
      (setq opt (cdr opt)))
    (LaTeX-insert-environment env (concat "[" opto "]"))))

I’ve never used the mailing list and would appreciate if someone could help me check with the development team…

preview-latex在GS9.00下报错

在emacs下其实很久不用preview-latex了,一直觉得没有必要——但是忽然用一下的时候发现不能用还是很郁闷的。基本上报错是这样的:

"GSWIN32C.EXE" "-dOutputFile=(_region_.prv/tmp5723kvc/pr1-1.png)" "-q""-dSAFER" "-dNOPAUSE" "-DNOPLATFONTS" "-dPrinted" "-dTextAlphaBits=4""-dGraphicsAlphaBits=4" "-sDEVICE=png16m" "-r70.4906x70.6156"
GS>{DELAYSAFER{.setsafe}if}stopped pop/.preview-BPcurrentpagedevice/BeginPage get dup null eq{pop{pop}bind}ifdef<</BeginPage{currentpagedevice/PageSize get dup 0 get 1 ne exch 1get 1 ne or{.preview-BP }{pop}ifelse}bind/PageSize[1 1]>>setpagedevice/preview-do{[count 3 roll save]3 1 roll dup length 0 eq{pop}{setpagedevice}{ifelse .runandhide}stopped{handleerror quit}if aload pop restore}bind def[(_region_.prv/tmp3712kvc/preview.dsc)(r)file]aload exch dup 0 setfileposition 520()/SubFileDecode filter cvx .runandhide aload pop dup dup 623 setfileposition 50()/SubFileDecode filter cvx<<>>preview-do
Error: /invalidfileaccess in --file--

查了一通后来发现有人遇到这个问题之后把GS降级到8.71以下就好了。说明GS在近来做了一些改动。左看右看看到了-dSAFER这个参数——这个参数本意是要加强权限检查防止gs自动打开系统文件权限——但和权限相关的也只有它了。试着在命令行下重新跑着两个命令(用gswin32会容易些,否则后面这个长命令贴都贴不进去),居然跑通了。又大致查了查,貌似可能是一个BUG,不过我升级到了最新的9.02也没有解决这个问题。

既然如此,到site-lisp/auctex/preview.elc(最好还是用.el重新编译一下) 下面找到
(defcustom preview-gs-options '("-q" "-dSAFER" "-dNOPAUSE" "-DNOPLATFONTS" "-dPrinted" "-dTextAlphaBits=4" "-dGraphicsAlphaBits=4")
-dSAFER一项干掉就是了。虽然这似乎是一个“漏洞”,不过就自己跑跑preview来看,应该没太大风险。

一个更为稳妥的办法是在.emacs里面加上'(preview-gs-options (quote ("-q" "-dNOPAUSE" "-DNOPLATFONTS" "-dPrinted" "-dTextAlphaBits=4" "-dGraphicsAlphaBits=4"))),就好了

LaTeX 中的分页环境

近来搞一个书稿,希望自己设计一个环境可以加点分页的边框底色什么的,毕竟么,内容和版式都重要,看得身心愉悦才能更好地看下去。于是想设定一个带底色或者不带底色的环境,在外侧加一个竖线,看起来多么简洁的想法啊,真做起来可不太容易。

找找现有的东西吧,找来找去找到一个 changebar,看看用起来挺简单,拿 XeTeX 一跑,报错:( 发现这个包的逻辑是算出坐标,然后用很多特殊的 ps 命令把线最后补上去。按说 XeTeX 对 pstricks 支持的还不错… 可惜不行。我这书稿肯定是不可能倒回去用 dvips 的,看看网上似乎有成功把它移植到 pdflatex 上的,但原作者从不回邮件,宏包也多年不更新了。本来想搞一下这些 special 的命令,终因没有时间细究而作罢。加底色的盒子可以用 xcolor,但是分页就实在要费些周折。

后来找到了 mdframed 包,可以画分页的盒子和边框。研究了一下包的原理,发现也颇为不易:把分页的内容暂存起来,然后分别按照第一页、中间页和末页的情况,用 rule 或者 tikz 或者 pstricks 画出底色,然后再把字用盒子放进去。作者实际上把这些盒子的计算都算好了,可以自己来定义 style 设定作画的方法。这确实是个不错的主意,处理起来余地也挺大。不过后来发现,边框和边距设定都是按照左右来分的,碰到双面排版的情况,左右边距实际上应该是内外边距。事情繁杂也没有心情仔细读代码,于是试着给作者 Marco Daniel 写信要求增加双面排版的功能。3 分钟后收到回信,承诺周末帮我搞一个出来。一日之后作者如约回信,附上了更新后的宏包、文档和 style 文件,说完全支持所有的定制功能很困难,不过单设一条框线可以,暂时只支持用 rule 画线。调试一下发现有些问题,后又往复几次,迅速解决,感叹作者之敬业及效率,实在是好人啊!

作者说后续再把用 tikz 和 pstricks 画线的功能补上,正式的新版本很值得期待!再次对 Marco 表示感谢!

基本共射放大器的一点粗浅分析兼答元增民教授

注:未经本人许可,请勿以任何方式转载、复制或摘录本帖内容,引用必须注明出处,谢谢合作。

近日元增民教授对我所提的有关质疑大为不满,并一定要出题给我做。其实这么明显的一个问题本来就没有什么多啰嗦的必要,但既然人家开口很多次了,而且大有我不做一下就不善罢甘休之势,我就只好这里做一下给元教授看看,如果有人看了觉得这个讨论有意义,也算是我没白忙活这半天。图见下,最简单的单管共射放大器,也可见元增民老师 PPT 第 7~8 页。 Continue reading “基本共射放大器的一点粗浅分析兼答元增民教授”

就“小信号放大器的缺陷”与元增民教授商榷

前日在哈尔滨举行 2010 电子高等教育学术研讨会,华师大一位老师参加了,会上听到了一个非常新颖而让人震惊的观点——电子学的基础理论:小信号放大器模型的缺陷。作者元增民教授多年奔走推广自己的研究成果,并且在大会上做了发言。本着奇文共欣赏的原则,这位老师回来将 PPT 转给家父,家父又转给了我。在这里可以看到元增民老师 PPTContinue reading “就“小信号放大器的缺陷”与元增民教授商榷”

用 Ghostscript 替换字体

放这儿以防止自己忘了…

1. 尽量使用 Acrobat 7 打印 pdf,然后另存成 eps。不要用 Acrobat 9! 同样一个文件,7 出来的 eps 260k,9 出来的 10M… 无数的乱七八糟的信息,bs Adobe 一记。
2. 假定原先的字体是 TimesNewRomanPSMT.*之类的,嵌入之后可能变成 ABCDEF+Times****,仅搜索/…..+Times.*? 然后替换成想要的字体,比如/Minion-Regular
3. 如果愿意,可以搜索 %ADOBeginSubsetFont: …..+Times.* 然后匹配%ADOEndSubsetFont,把嵌入的字体去掉
4. 文件末还可能有 /TJMAAA+TimesNewRomanPS-ItalicMT /Font _pdfUndefineResource ^J /N10 /Font _pdfUndefineResource 之类的,也去掉
5. 用 GSView 看一下,保证字体已经替换好了
6. MikTeX/CTeX 2.8 里面自带了一个 gs…(这实在很让人迷惑),叫做 mgs.exe
7. 如果想用这个,可以去 MikTeXghostscriptbase 相应目录里面去找 Fontmap. 这里面定义了具体指向哪个 Fontmap 文件(默认是.aliases..)
8. 如果不想用,直接把它改个名字,然后把自己的 gswin32c 复制一份叫做 mgs.exe
9. mgs -h 查看文件搜索路径
10. 把 Fontmap.atb 复制一份,叫做 Fontmap
11. 把 Minion 添进去,比如
/Minion-Regular (morg____.pfb) ;
/Minion-Bold (mob_____.pfb) ;
/Minion-Italic (moi_____.pfb) ;
/Minion-BoldItalic (mobi____.pfb) ;
12. 试着用 XeTeX 编译一下吧,应该可以看到替换嵌入的字体了,撒花~
13. 注意,GS 的字体搜索路径要在环境变量 FontResourceDir 中定义。
14. 这种办法的缺点在于,可移植性有点差。

补充一些内容:在 MacTeX 环境下,可以新建 /usr/local/share/ghostscript/8.71/lib/Fontmap 来控制字体名称的匹配。用 gs –help 可以看到字体搜索路径。

Times, or Times New Roman?

You may have been well aware of the notorious Microsoft versions of fonts: Arial the inferior imitation to the classic Helvetica, and Book Antiqua that resembles Palatino – if not, please refer to ARIAL vs HELVETICA and Wikipedia on Palatino. I would like to eradicate Arial from all my delivered works (GhostScript helped a lot). Now, for the ubiquitous TIMES NEW ROMAN, is there anything wrong?
Continue reading “Times, or Times New Roman?”

XeTeX:结合 MathTime 和 Adobe 字体

忍了很久之后终于按捺不住诱惑,刚刚上手接触 XeTeX。选择字体实在太方便了,想想以前每次重配 LaTeX 安装字体时候花的功夫就觉得很崩溃…

现在好了,不管什么中文字体英文字体统统都是拿过来直接用,再也不用自己去生成 fontmap 之类的了。兴奋了一阵子之后,觉得要是能把 Arno Pro、Minion Pro 之类的字体融合到 MathTime 的符号多好… 可惜 fontspec 包对于数学的支持实在平平,作者另外搞了一个 unipre-math 据说不错,可是难道我们折腾半天就是为了用 Cambria Math?? 那么就自己来搞一下。 Continue reading “XeTeX:结合 MathTime 和 Adobe 字体”

damn numerical error in Fortran

if we run the following simple code:
F90:

program foo
real*8 :: a = 0
integer :: n
do n=0,100,1
print*,a
a = a + 0.01
end do
end program foo

C:

#include <stdio.h>
void main(void)
{
double a = 0;
int n;
for(n=0; n<=100; n++)
{
printf(” %.10f n”,a);
a += 0.01;
}
}

we may find different outputs from different compilers:
Intel Fortran g95 Gcc
0.909999979659915
0.919999979436398
0.929999979212880
0.939999978989363
0.949999978765845
0.959999978542328
0.969999978318810
0.979999978095293
0.989999977871776
0.999999977648258
0.909999979659915
0.9199999794363976
0.9299999792128801
0.9399999789893627
0.9499999787658453
0.9599999785423279
0.9699999783188105
0.979999978095293
0.9899999778717756
0.9999999776482582
0.9100000000
0.9200000000
0.9300000000
0.9400000000
0.9500000000
0.9600000000
0.9700000000
0.9800000000
0.9900000000
1.0000000000
if we change that +0.01 to +0.01d0, it will improve the accuracy but still unsatisfactory
Ifort real*16 Ifort real*8 G95 real*8
0.910000000000000018943180357666733
0.920000000000000019151347174783950 0.930000000000000019359513991901167 0.940000000000000019567680809018384 0.950000000000000019775847626135601 0.960000000000000019984014443252818 0.970000000000000020192181260370035 0.980000000000000020400348077487251 0.990000000000000020608514894604468 1.00000000000000002081668171172169
0.910000000000001
0.920000000000001
0.930000000000001
0.940000000000001
0.950000000000001
0.960000000000001
0.970000000000001
0.980000000000001
0.990000000000001
1.00000000000000
0.9100000000000006
0.9200000000000006
0.9300000000000006
0.9400000000000006
0.9500000000000006
0.9600000000000006
0.9700000000000006
0.9800000000000006
0.9900000000000007
1.0000000000000007
so.. god bless fortran…