\includegraphics pagebox sem recorte

\includegraphics pagebox sem recorte

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 bbmanualmente 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}

insira a descrição da imagem aqui

\l_tmpa_intprovavelmente não é necessário, \pdflastximageparece 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 epdfbiblioteca, 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):

Saída do código acima; o primeiro gráfico está cortado, o segundo não

informação relacionada