У меня есть несколько иконок PDF с TrimBox, отличным от MediaBox.Например:
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
Я хотел бы включить изображение таким образом, чтобы использовать TrimBox для позиционирования и размеров и показать все содержимое из MediaBox. Но, поскольку я ленивый, я хочу сделать это без bb
ручной настройки в \includegraphics
.
Что я пробовал, но пока не работает:
\includegraphics[pagebox=trimbox, clip=false]{my-picture}
Что работает, но слишком специфично (не все значки одинаковы):
\includegraphics[bb=0 4.25 21.26 20.69, clip=false]{my-picture}
Каковы способы сделать это без необходимости ручной обрезки графики в исходном файле LaTeX?
Я использую LuaLaTeX, поэтому одним из вариантов может быть сохранение иконок в шрифте в виде глифов, но некоторые из них имеют формы, которые искажаются при преобразовании (пробовалШрифт Пользовательский) и один из них имеет два цвета (да, я знаюэто может больше не быть проблемой).
решение1
Похоже, следующее работает для pdflatex (я переименовал ваш файл в 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
возможно, это и не нужно, \pdflastximage
кажется, тоже работает, но я посчитал немного смелым обратиться к последнему изображению во время создания нового.
lualatex не знает команду \pdfximagbbox
, поэтому для получения значений области просмотра не обойтись без небольшого кода lua:
\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}
решение2
Используя рекомендацию Дэвида Карлайла взглянуть на библиотеку, epdf
я получил то, что удовлетворяет моим потребностям, поэтому я публикую это как ответ. Однако я готов принять что-то более общее, не только lua или просто лучшее.
Вот рабочий код:
\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}
Вывод выглядит следующим образом (с использованиемизображение из вопроса):