Re: [心得] 裁切 pdf 的頁面(添加巨集功能)

作者: bleph (bleph)   2015-01-21 21:15:42
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}
作者: andrew43 (討厭有好心推文後刪文者)   2015-01-21 21:47:00
好文!
作者: bleph (bleph)   2015-01-22 12:49:00
謝謝您的謬讚

Links booklink

Contact Us: admin [ a t ] ucptt.com