Tenho alguns ícones de PDF com um TrimBox diferente do MediaBox.Por exemplo:
Page size: 23.2441 x 20.6929 pts (rotated 0 degrees)
MediaBox: 0.00 0.00 23.24 20.69
CropBox: 0.00 0.00 23.24 20.69
BleedBox: 0.00 0.00 23.24 20.69
TrimBox: 0.00 4.25 21.26 20.69
ArtBox: 0.00 4.25 21.26 20.69
Gostaria de incluir a imagem de forma que utilize o TrimBox para posicionamento e dimensões e mostre todo o conteúdo do MediaBox. Mas, como sou preguiçoso, quero fazer isso sem configurar bb
manualmente no \includegraphics
.
O que eu tentei, mas não funciona até agora:
\includegraphics[pagebox=trimbox, clip=false]{my-picture}
O que funciona, mas é muito específico (nem todos os ícones são iguais):
\includegraphics[bb=0 4.25 21.26 20.69, clip=false]{my-picture}
Quais são as maneiras de fazer isso sem precisar cortar os gráficos manualmente na fonte LaTeX?
Eu uso LuaLaTeX, então uma opção poderia ser armazenar os ícones em uma fonte como glifos, mas alguns deles têm formas que ficam distorcidas na conversão (tenteiFonte personalizada) e um deles tem duas cores (sim, eu seiisso pode não ser mais um problema).
Responder1
O seguinte parece funcionar para pdflatex (renomeei seu arquivo para trimbox.pdf):
\documentclass[a4paper]{article}
\usepackage{graphicx,expl3}
\begin{document}
\fbox{\includegraphics{trimbox}}
\ExplSyntaxOn
\fbox{%
\pdfpagebox=4 ~ %force use of trimbox
\pdfximage{trimbox.pdf}
\int_set:Nn\l_tmpa_int{\pdflastximage}
\includegraphics[viewport=
\dim_to_decimal:n{\pdfximagebbox\l_tmpa_int~1}~ % Returns lower-left x
\dim_to_decimal:n{\pdfximagebbox\l_tmpa_int~2}~ % Returns lower-left y
\dim_to_decimal:n{\pdfximagebbox\l_tmpa_int~3}~ % Returns upper-right x
\dim_to_decimal:n{\pdfximagebbox\l_tmpa_int~4} % Returns upper-right y
]{trimbox}}
\ExplSyntaxOff
\end{document}
\l_tmpa_int
provavelmente não é necessário, \pdflastximage
parece funcionar também, mas achei um pouco corajoso acessar a última imagem no meio de uma nova.
lualatex não conhece o comando \pdfximagbbox
, então um pouco de código lua não pode ser evitado para obter os valores da janela de visualização:
\documentclass[a4paper]{article}
\usepackage{graphicx,expl3}
\begin{document}
\fbox{\includegraphics{trimbox}}
\directlua{
a = img.new({filename='trimbox.pdf',pagebox='trim'})
img.scan(a)
}
\fbox{\includegraphics[viewport=\directlua{tex.print(a.bbox[1]/ 65536)}
\directlua{tex.print(a.bbox[2]/ 65536)}
\directlua{tex.print(a.bbox[3]/ 65536)}
\directlua{tex.print(a.bbox[4]/ 65536)}]{trimbox}}
\end{document}
Responder2
Seguindo a recomendação de David Carlisle de dar uma olhada na epdf
biblioteca, consegui algo que atende às minhas necessidades, então estou postando como resposta. No entanto, estou disposto a aceitar algo que seja mais geral, não apenas lua ou apenas melhor.
Aqui está um código funcional:
\documentclass{article}
\usepackage{graphicx}
\usepackage{luacode}
\begin{luacode*}
function bbTrimBox(options,docname)
tex.print("\\includegraphics")
if options ~= "" then
tex.print("["..options)
end
local doc = epdf.open(docname)
if doc == nil then
doc = epdf.open(docname .. ".pdf")
end
if doc == nil then
tex.error("Could not find PDF file \""..docname.."\"")
if options ~= "" then
tex.print("]")
end
else
if options ~= "" then
tex.print(",")
else
tex.print("[")
end
local box = doc:getCatalog():getPage(1):getTrimBox()
local bb = "bb=" .. box.x1 .. " " .. box.y1 .. " " .. box.x2 .. " " .. box.y2
tex.print(bb)
tex.print("]")
-- doc:close() -- cannot call this, "attempt to call method 'close' (a nil value)"
end
tex.print("{"..docname.."}")
end
\end{luacode*}
\newcommand\includegraphicsbb[2][]{\directlua{bbTrimBox("#1", "#2")}}
\begin{document}
\fontsize{30}{40}\selectfont
This a test text \includegraphics[height=1em, pagebox=trimbox, clip=false]{mwe} \includegraphicsbb[height=1em]{mwe}
\end{document}
A saída é a seguinte (usando oimagem da pergunta):