graphics

Alineación vertical rota con gráficos en tabularray

Example:

\documentclass[10pt]{article}

\usepackage[utf8]{inputenc}
\usepackage{mwe}
\usepackage{graphicx}
\usepackage{tabularray}
\UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands \\ onto two lines}

\begin{document}

\begin{center}
\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    \includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
\end{tblr}
\end{center}

\end{document}

La imagen puede tener una relación de aspecto variable;mi caso inmediato es uno más amplio.También se muestran las líneas h/v para ilustrar que no las necesito.

En concreto,quiero que las dos celdas alineen sus cuadros delimitadores en los centros verticales,independientemente del contenido.

Me las arreglé para descifrar la expansión macro (esto no necesita expand irse , ¡necesita varwidth !), pero no puedo encontrar nada que controle la alineación de la imagen. Envolver la imagen en un \begin{tblr}{c}...\end{tblr} casi funciona, pero envía un millón de advertencias y el espacio entre h es incorrecto. (No veo nada sobre tblr anidados , ¿está permitido alguna vez?)

Posiblemente relacionado: tabularray, que incluye gráficos \linewidth en columnas X genera un gran espacio vertical (¿ lo está arreglando el adjustbox de ajuste ?)


muy interesante.Supongo que se trata de un comportamiento involuntario debido a cómo tabularray calcula el centro.

un arreglo realmente bueno sólo es posible si el autor actualiza el paquete (o si alguien proporciona un parche,pero entonces dejar que el autor actualice el paquete es mejor)

en resumen,creo que la causa es la siguiente...

primero, para centrar la matriz, debe colocar el contenido en un cuadro, luego medir la altura y la profundidad del cuadro. Pero si hace exactamente eso, la línea de base de un carácter con descendiente (p. ej . y ) estará por encima de la línea de base de un carácter sin (p. ej . a ).

entonces, no estoy seguro de cómo tabularray implementa exactamente la alineación central (el código fuente es seguramente denso), pero experimentalmente este fragmento:

\begin{tblr}{width=0.9\linewidth, colspec={X[m] X[2,m]}}
    {
        A line of text \\
        Some additional text \\
    } &
    {
    aa\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
    \\
    bb\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}
}
\end{tblr}

da la salida

por lo que puedo adivinar que toma el punto medio de (la parte superior de un puntal en la primera línea)y (la parte inferior de un puntal en la última línea).

en este caso parece que podría ser mejor tomar max(la parte superior del puntal en la primera línea,la parte superior real de la primera línea)en su lugar.No estoy seguro de que haya algún caso en el que esto dé un resultado peor que el actual.

currently

\begin{tblr}{width=0.9\linewidth, colspec={X[m] X[2,m]}}
    some text & \rule{2pt}{15pt} other text with a tall column \rule{2pt}{15pt}
\end{tblr}

provides

con el cambio,la línea de base ya no estará alineada.¿Sería deseable...?

Más prácticamente, hay fórmulas en línea excepcionalmente altas como $5^{2^2}$ , el mismo problema. Habiendo dicho esto en particular, ya sesgó el salto de línea de base cada vez que se usa, así que tal vez eso no sea un problema...


De todos modos,dada la explicación de cómo supongo que funciona más arriba,se me ocurre una solución (que,si has entendido lo anterior,deberías ser capaz de entender por qué esta también funciona).

\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    {
        random text here \\
        \includegraphics[width=\linewidth, height=0.3\linewidth]{example-image} \\
        random text here
    }
\end{tblr}

el texto aleatorio es solo para demostración. Reemplace con \strut o lo que sea invisible que desee.

Desventaja,esto sólo funcionará si la primera celda es más alta que la segunda,lo que desafortunadamente no es el caso aquí.


Me encuentro con /a/112977/250119 que menciona el paquete de ajuste, pensando en ello, el punto medio de la parte superior del puntal (0.7\baselineskip) y la parte inferior del puntal (-0.3\baselineskip) es 0.2\baselineskip , por lo que puede usar valign de tipo m de la caja de adjustbox como esta

\def\adjboxvcenter{0.2\baselineskip}

\begin{center}
\begin{tblr}{
        measure=vbox,
        width=0.9\linewidth,
        colspec={X[l,m] X[2,c,m]},
        hlines, vlines
    }
    {
        A single line of text \\
        Some additional text \\
        \mymacro
    } &
    \adjustbox{valign=m}{\includegraphics[width=\linewidth, height=0.3\linewidth]{example-image}}
\end{tblr}
\end{center}

si todas mis suposiciones anteriores son correctas,esto debería estar perfectamente centrado.

nota al margen,en lugar de "asumir" la altura,adjustbox (presumiblemente)mide la altura en su lugar,por lo que es un poco más conveniente...

y sí,si usas valign de tipo m podría ser más simple usar tabular en su lugar pero-necesitas algo más para hacer líneas múltiples-\linewidth es el ancho de línea grande,no el ancho de la celda:

    \begin{tabular}{ll}
        \adjustbox{valign=m}{\begin{tabular}{l}
                A single line of text \\
                Some additional text \\
                \mymacro
        \end{tabular}} &
        \adjustbox{valign=m}{\includegraphics[width=0.6\linewidth, height=0.2\linewidth]{example-image}}
    \end{tabular}



Actualizar. Parece que establecer la primera celda en h alinea correctamente ambos elementos.


Hay que corregir las líneas de base de ambos elementos.

Creo que \SetCell{h} establece la línea base del texto en su primera línea.

Luego, como se sugiere, use \raisebox{}{} para arrastrar la imagen hacia abajo por la altura de una imagen menos alguna corrección (por ejemplo, la altura de una línea de texto). Al hacerlo, mueve efectivamente su línea de base hacia arriba.

Entonces las líneas de base de los dos elementos coincidirán y se obtendrá la alineación deseada.

\documentclass[10pt]{article}
\usepackage{graphicx}
\usepackage{tabularray}
    \UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands\\onto two lines}

\begin{document}
\centering
\begin{tblr}{
        colspec={X[h] X[2]},
        measure=vbox,
        width=0.9\linewidth,
    }
    {A line of text\\Some additional text\\\mymacro}
        & \includegraphics[width=\linewidth]{example-image}
\end{tblr}
\end{document}

EDIT.Alineación vertical media

\documentclass[10pt]{article}
\usepackage{graphicx}
\usepackage{tabularray}
    \UseTblrLibrary{varwidth}

\newcommand{\mymacro}{This macro expands\\onto two lines}

\setlength{\fboxsep}{0pt}

\begin{document}
\centering
\begin{tblr}{
        colspec={X[h,m] X[2,m]},
        measure=vbox,
        width=0.9\linewidth,
    }
    \parbox{\linewidth}{A line of text\\Some additional text\\\mymacro}
        & \raisebox{-0.5\totalheight}{\includegraphics[width=\linewidth]{example-image}}
\end{tblr}
\end{document}