Ich habe einige PDF-Symbole mit einer TrimBox, die sich von der MediaBox unterscheidet.Zum Beispiel:
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
Ich möchte das Bild so einbinden, dass die TrimBox für die Positionierung und Abmessungen verwendet wird und der gesamte Inhalt aus der MediaBox angezeigt wird. Da ich aber faul bin, möchte ich dies ohne bb
manuelle Einstellungen tun \includegraphics
.
Was ich versucht habe, aber bisher nicht funktioniert hat:
\includegraphics[pagebox=trimbox, clip=false]{my-picture}
Was funktioniert, aber zu spezifisch ist (nicht alle Symbole sind gleich):
\includegraphics[bb=0 4.25 21.26 20.69, clip=false]{my-picture}
Welche Möglichkeiten gibt es, dies zu tun, ohne die Grafiken im LaTeX-Quellcode manuell zuschneiden zu müssen?
Ich verwende LuaLaTeX, daher könnte eine Option darin bestehen, die Symbole in einer Schriftart als Glyphen zu speichern, aber einige von ihnen haben Formen, die bei der Konvertierung verstümmelt werden (versuchtSchriftart Benutzerdefiniert) und einer davon hat zwei Farben (ja, ich weißdas ist möglicherweise kein Problem mehr).
Antwort1
Folgendes scheint für pdflatex zu funktionieren (ich habe Ihre Datei in trimbox.pdf umbenannt):
\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
ist wohl nicht nötig, \pdflastximage
scheint auch zu funktionieren, allerdings fand ich es etwas mutig, mitten in einem neuen Bild auf das letzte zuzugreifen.
lualatex kennt den Befehl nicht \pdfximagbbox
, daher lässt sich ein bisschen Lua-Code nicht vermeiden, um die Viewport-Werte zu erhalten:
\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}
Antwort2
Auf David Carlisles Empfehlung hin, einen Blick in die epdf
Bibliothek zu werfen, habe ich etwas gefunden, das meinen Anforderungen entspricht, und poste es daher als Antwort. Ich bin jedoch bereit, etwas Allgemeineres zu akzeptieren, das nicht nur Lua unterstützt oder einfach besser ist.
Hier ist ein funktionierender Code:
\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}
Die Ausgabe ist wie folgt (unter Verwendung derBild aus der Frage):