includegraphics 与 adjustbox 搭配虽然好用
但是就 adjustbox 中裁切的功能来说,
左侧边界及上方边界虽然一望便知
右侧边界及下方边界还要计算就比较麻烦了
如果像是用 foxit reader, 得先确定该 pdf 档的页面大小, 再减去图片
的右界/下界, 才能得到应裁切的量
当资料量一多的时候, 时常计算是蛮繁琐的
上面的问题可以用 LaTeX 中简易的宏计算功能加以解决
即引入 fp 套件
不过问题又来了, LaTeX 当中的宏定义最多只能提供9个变量
但是我们的计算里必须有很多资讯加以考虑:
例如: 欲引入 pdf 页面的页数, 长宽, 档名 (4个变量)
左 下 右 上 四个边界 (4个变量)
引入的图片是否需放大或缩小? 是否需旋转? (2 个变量)
是否要给予标题/label (2个变量) ...
因此, 单纯的 LaTeX 宏很难处理这些问题
况且 #1 ~ #9 的宏变量也不容易除错修改
比较好的办法应该是使用 xkeyval 这个套件
xkeyval 套件的中文文件很少, 大部份是英文的
而且给的范例也不好懂
以 C 语言来比喻, 这些范例不是从 Hello World 开始 ,
反而像是在谈指标, 谈字串 ~~~ 晕倒
最简单的 xkeyval 使用方式应该像这样:
\makeatletter % 开始
\define@key{family}{keya}{\def\mykeya{#1}}
\newcommand{\printmykey}[1]{
\setkeys{family}{#1}
this is \mykeya }
\makeatother % 结束
\define@key{}{}{} => 第1个{}内是 family, 即其后定义的 keya 属于
family 这个群组
第3个 {} 内是命令, 意即取得 keya 这个 key 后要做的事
在范例中, 敝人是通过取得使用者输入的 keya 值, 设定一变量 \mykeya
以便在之后使用 \mykeya
如果使用者没有提供该 key, 也要有 presetkeys 的功能可提供默认值
以下是敝人的 tex 档, 请参考:
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{fixltx2e}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{float}
\usepackage{wrapfig}
\usepackage{soul}
\usepackage{textcomp}
\usepackage{marvosym}
\usepackage{wasysym}
\usepackage{latexsym}
\usepackage{amssymb}
\usepackage{hyperref}
\tolerance=1000
\usepackage{fontspec}
\usepackage[boldfont,slantfont]{xeCJK}
\setCJKmainfont{cwTeX Q Ming Medium}
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip=0pt plus 1pt
\usepackage{fp}
\usepackage{xkeyval}
\usepackage{adjustbox}
\providecommand{\alert}[1]{\textbf{#1}}
%先对 pdf 纸张大小设定默认值为 A4 paper
\def\sourcepdfwidth{21.4}
\def\sourcepdfheight{29.7}
\makeatletter %开始
\define@key{pdfmanage}{lt}{\def\myleftmargin{#1}} %左边界,也是左侧应裁切的量
\define@key{pdfmanage}{rt}{\def\myrightmargin{#1}} %右边界
\define@key{pdfmanage}{up}{\def\myuppermargin{#1}} %上方边界, 也是应裁的量
\define@key{pdfmanage}{dn}{\def\mydownmargin{#1}} %下方边界
\define@key{pdfmanage}{angle}{\def\myangle{#1}} %旋转角度
\define@key{pdfmanage}{page}{\def\mypage{#1}} %页数
\define@key{pdfmanage}{newwidth}{\def\mynewwidth{#1}} %裁割后的图片新的宽度
\define@key{pdfmanage}{scewidth}{\def\mysourcewidth{#1}} %pdf 页面宽度
\define@key{pdfmanage}{sceheight}{\def\mysourceheight{#1}} %pdf 页面高度
\define@key{pdfmanage}{source}{\def\mysourcefilename{#1}} %pdf 档名
%底下提供默认值
\presetkeys{pdfmanage}{lt=0,rt=0,up=0,dn=0,angle=0,page=1,
newwidth=0.5\textwidth, scewidth=\sourcepdfwidth,
sceheight=\sourcepdfheight}{}
\newcommand{\getsourcepdfparameter}[1]{
\setkeys{pdfmanage}{#1}
}
\makeatother %结束
\newcommand{\myincludepdfgraphics}[1]{
\getsourcepdfparameter{#1}
%底下使用 fp 套件计算右边界及下方边界应裁的量
\FPeval\truerightmargin{\mysourcewidth-\myrightmargin}
\FPeval\truedownmargin{\mysourceheight-\mydownmargin}
\resizebox{\mynewwidth cm}{!}{ %请注意 \mynewwidth 与其后的"公分"
%有一空白键隔开
\adjustbox{trim=\myleftmargin cm \truedownmargin cm \truerightmargin cm
\myuppermargin cm,clip}{%
\includegraphics[angle=\myangle,page=\mypage]{\mysourcefilename}}}
}
\begin{document}
%测试范例 1
\myincludepdfgraphics{page=5,scewidth=21,source=4756.pdf,
sceheight=27.94,lt=1.7,dn=11.6,up=2.3,rt=11.5,newwidth=5}
%测试范例 2 , 也可以使用 figure 环境
\begin{figure}{
\myincludepdfgraphics{page=3,scewidth=21,source=4756.pdf,
sceheight=27.94,lt=1.4,dn=14.4,up=2.3,rt=7.1,newwidth=3.5}
\caption{第二张图} \label{fig2}
}
\end{figure}
\end{document}