作者bleph (bleph)
看板LaTeX
标题Re: [心得] 裁切 pdf 的页面(添加巨集功能)
时间Wed Jan 21 21:15:42 2015
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}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.63.211.145
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LaTeX/M.1421846145.A.877.html
1F:推 andrew43: 好文! 01/21 21:47
2F:→ bleph: 谢谢您的谬赞 01/22 12:49
※ 编辑: bleph (210.63.211.145), 01/22/2015 12:55:19
※ 编辑: bleph (210.63.211.145), 01/22/2015 13:01:27