2009年11月23日星期一

My LaTeX Tips -- 简单与唯美 -- 编程爱好者博客

My LaTeX Tips -- 简单与唯美 -- 编程爱好者博客

My LaTeX Tips

1. 如何让TeX找到你最新加入的宏包(*.sty)文件?
最简单的方法就是再你将你的*.sty文件放入CTeX目录树下后,在DOS下敲入texhash命令即可。否则,
TeX编译会找不到你的*.sty文件。

详细解释:

TEX 系统通过这个数据库记录了所需要的各种文件的名字和具体目录位置。每次你往系统中添加文件
后,都要记得刷新这个数据库,否则TEX 有可能找不到需要的文件。
刷新文件名数据库的具体命令取决于你使用的TEX 系统。teTEX 和fpTEX 的命令是texhash
MiKTEX 用户可以在Dos 窗口中输入以下命令
initexmf --update-fndb
或者使用MiKTEX 提供的图形界面工具MiKTEX Options。在开始菜单中找到MiKTEX Options,打开点击
General 页上的Refresh Now 按钮即可。

2. input{file}与include{file}
前者不换页,后者换页。

3. 更改插图题头(默认为:Figure 1: 改为:图 1 )
%% 用caption2宏包
\renewcommand\figurename{\textbf{图}} % 插图题头
%% 定义如 "图(表)1: 示例" 中的间隔符号,如 ":" ,这里定义为空
\renewcommand{\captionlabeldelim}{}
%定义图表编号与标题间的间隔距离
\renewcommand{\captionlabelsep}{\hspace{1em}}

4. 如何使生成的pdf文本粘贴无乱码?
今天是学习LaTeX的第3天,越来越有兴趣了。 :P
我习惯在WinEdt中直接用CCT&LaTeX按钮生成ps文件,然后再用ps2pdf按钮转成pdf文件。但结果发现生成的pdf文件中,复制粘贴其中的文本出来却是乱码 :blink: 。后来,我终于摸索出一个办法:
生成dvi文件后,用dvipdfmx + 文件名.dvi命令去生成pdf文件,这时复制粘贴其中的文本出来的就不再是乱码了,而且中文搜索也没问题。

5. 自带的guide一般在以下两个地方:

如果是系统安装的packages,则大多在$TEXMF$\doc\latex\THE-NAME-OF-THE-PACKAGE目录下,如hyperref的在:$TEXMF$\doc\latex\hyperref下的manual.tex和options.tex等,一些比较科普的在$TEXMF$\doc\latex\base下。

如果是系统安装的packages,则大多在$TEXMF$\doc\latex\THE-NAME-OF-THE-PACKAGE目录下,如hyperref的在:$TEXMF$\doc\latex\hyperref下的manual.tex和options.tex等,一些比较科普的在$TEXMF$\doc\latex\base下。

If是你自己解压缩的,就比较有可能在安装package的目录下。$localtexmf$(或者$texmf-local$之类的)\doc\latex下也有可能。

6. 实现参考文献编号的上标格式用overcite好还是用natbib好?
我认为是用\usepackage[super]{natbib}比用\usepackage{overcite}好,因为
1) overcite生成的文献编号会发生格式混乱,如:
  自从某某东东被发现以来\cite{sth}...
如果用overcite宏包,三个.就会只出现一个.,而且还在文献编号之前。
2) 使用overcite后,用hyperref宏包实现的参考文献的链接就不管用了。
而\usepackage[super]{natbib}就没有以上问题。

7. 加入\usepackage{hyperref} 可以自动将图表文献的引用变成超链接,但它们都是仅仅将编号的数字变成超链接,如图(1),表(3),而我想将相应的文字也超链接,即:(图1),(表3),请问该怎么实现?

可以利用{hyperref} 包中的\autoref功能。只要将引用图或表的\ref{label}换成\autoref{label}即可。但有个问题就是,这样处理的结果是英文的,即“Figure 1”。要想超链接的文字变成“图1”,可以预先做如下的重定义:
\renewcommand\figureautorefname{图}

可以利用{hyperref} 包中的\autoref功能。只要将引用图或表的\ref{label}换成\autoref{label}即可。但有个问题就是,这样处理的结果是英文的,即“Figure 1”。要想超链接的文字变成“图1”,可以预先做如下的重定义:
\renewcommand\figureautorefname{图}

8. 为什么我用hyperref实现的pdf中文书签是乱码?
如果用 dvipdfmx 的话, 可在导言区加入:
\AtBeginDvi{\special{pdf:tounicode GBK-EUC-UCS2}}
若用 dvipdfm 或 dvips, pdflatex 等, 则要使用 gbk2uni来对生成书签的 .out 文件进行处理,即gbk2uni是一个专们对书签"汉化"的程序,对你编译的.out文件,在命令行输入gbk2uni ss.out。

9. 如何在MetaPost中使用汉字?

我先用王垠的方法:
  1). 在mp文件开头加入:
verbatimtex
%&latex
\documentclass{article}
\usepackage{CJK}
\begin{CJK}{GBK}{song}
\begin{document}
etex

  2). 在最后加入:
verbatimtex
\end{CJK}
\end{document}
etex

  3). 标号时把标号都用 btex...etex 括起来。比如:
label.top(btex 原点 etex, origin);

但我编译总是不通过。我想了一下,mpost处理TeX部分是这样的:
先用MPToTeX程序把*.mp文件中的文本中verbatimtex与etex之间的部分都提取出来,其余部分都注释掉,将输出结果输出到*.mpx文件中。然后用其默认TeX程序(默认为TeX)将*.mpx文件转化成*.dvi文件,再用DVItoMP将*.dvi文件转成*.mp文件,然后再将*.mp文件处理成eps图形文件。我发现我用mpost处理出错的步骤主要是TeX将*.mpx文件转化成*.dvi文件的那一步(是不是我的TeX版本的问题(我的TeX版本是3.141592(MiKTeX 2.4))???),也就是说我的TeX居然无法识别\documentclass等命令?!但是我的LaTeX程序是很正常的,因为我一直在用,所以我想,能不能将metapost的默认TeX程序改成LaTex。王垠提到的方法是加入%&latex,这样TeX 就会读入 latex 格式 ,但是这种方法不是根本解决方法,因为真正的处理程序仍然是TeX而不是LaTeX,因此一旦自己机器上的TeX版本不同,就会出问题,比如有人提到(
http://www.freelinuxer.net/~firefox/blogger/2004/03/metapost.html)用TeXLive需要将%&latex改成%&cslatex。

其实,metapost专门有个-tex=TEXPROGRAM选项,可以修改其默认TeX处理程序,如果我想将LaTeX作为metapost的其默认TeX处理程序,就可以这样写:

mpost -tex=latex test.mp

这时,在你的*.mp文件中就无需加入%&latex这一行,而且不必担心自己的TeX版本就可以放心的在MetaPost中使用汉字了。

10. 如何将MetaPost生成的图片格式转成*.eps格式?
我们知道,MetaPost把*.mp源文件生成一个叫做*.1, *.2, ...的图形文件,其格式叫做*.mps格式。这种格式不同于标准的*.eps图形格式,无法被如photoshop等其他图形软件直接识别,而且也不能被gsview直接浏览(
http://learn.tsinghua.edu.cn/homepage/2001315450/metapost.html),只能在*.tex文件中作为图片插入。

然而,有时投稿时编辑部需要另外附上独立的*.eps格式的图片,而MetaPost生成的*.mps文件往往不适用。为此,有人特意写了一个Unix下的Shell脚本,可以将*.mps格式转换成*.eps格式。具体代码如下:
#!/bin/bash
# Written by Kong Hoon Lee <
konghoon@dreamwiz.com>, someday before 2001
#
# - This scrīpt can be used only with Bash shell
# - LaTeX is required.
#
# Usage:
#       mptoeps <filename | path of files>
#
# - Wildcards "*" or "?" can be used instead of <filename>.
# - The converted "eps" files are stored in the current directory.
#

for NAME in $@;
do
if [ -f $NAME ]; then
   HEADER=`grep -n '%!PS' $NAME`
   CREATOR=`grep -n '%%Creator' $NAME`

   if [ "$HEADER" != "1:%!PS" ] || [ "$CREATOR" != "3:%%Creator: MetaPost" ]
   then continue; fi

  dirname=${NAME%/*}
  filename=${NAME##*/}
  name_ext=${filename##*.}  
  if [ "$name_ext" = "mps" ]; then continue; fi
  name_base=${filename%.*}

  newfile=${name_base}_${name_ext}.eps
  newname=${name_base}_tmp_${name_ext}

     if [ ! -f $newname.tex ]; then
cat > $newname.tex << EOF
\documentclass[a4paper,landscape]{article}
\usepackage{graphicx}
\pagestyle{empty}
\setlength{\textheight}{13in}
\setlength{\topmargin}{-0.5in}
\setlength{\headsep}{0.0in}
\setlength{\topskip}{0in}
\begin{document}
\par\centerline{\includegraphics[scale=1.0]{$NAME}}
\end{document}
EOF

        latex $newname >/dev/null 2>&1 \
        && dvips -E $newname -o $newfile >/dev/null 2>&1
        rm -f $newname.tex $newname.dvi $newname.log $newname.aux
        echo "$NAME --> $newfile"
     else
        echo "Error: $newname.tex exists and conversion fails."
     fi
else
  echo "$NAME is not a regular file."
fi
done

但是,也有不少人用的是Windows版本的LaTeX,所以我自己用C语言写了一个在MS-DOS下将*.mps格式转换成*.eps格式的程序,叫做mps2eps。
用法很简单:
命令行输入:
mps2eps 文件名

这个程序可以从http://www.ctex.org/forums/index.php?act=Attach&type=post&id=16180上下载。

11. 用\def定义新命令时,命令的名称不要带有数字。
  例如,我定义了如下两个命令,编译时就会发生冲突:
\def\c2cnt#1#2{C$_2$@$(#1,#2)$}
\def\c2chain{C$_2$-Chain}
  而可以改成:
\def\cIIcnt#1#2{C$_2$@$(#1,#2)$}
\def\cIIchain{C$_2$-Chain}

12. 为什么photoshop导出的eps文件latex不认?
   加上bounding box就行了,具体方法是:
  用GSView打开看看大小(比如是800*600),在\includegraphics选项中加入bb=0 0 x y,
如:
\includegraphics[width=0.5\textwidth,bb=0 0 800 600]{1.eps}