revtex y turnpage: también rota la vista de la página PDF 90 grados hacia la orientación horizontal

revtex y turnpage: también rota la vista de la página PDF 90 grados hacia la orientación horizontal

En el siguiente revtex4, ¿podríamos hacer que el cambio de página también gire la vista de la página PDF 90 grados hacia la derecha?horizontalOrientación (más que simplemente rotar el contenido 90 grados pero manteniendo la página igual).verticalorientación)?

\documentclass[aps,pre,superscriptaddress]{revtex4-1}

\begin{turnpage}

\begin{figure} or 
\begin{table}

[...]

\end{figure} or \end{table}

\end{turnpage}

Otras funciones similares son:

\usepackage{lscape} 

\begin{landscape} 

\end{landscape} 

Respuesta1

Para reformular la pregunta tal como la entendí, ya que parece haber cierta confusión en los comentarios: revtex4( 4-1y 4-2) proporciona el turnpageentorno, que escribe los contenidos en modo horizontal. Sin embargo. el PDF todavía muestra la página horizontal en orientación vertical. Le gustaría que esta página no solo se escriba en modo horizontal, sino que también se muestre en la misma orientación.*

Logré lograr esto mediante un "código mágico" que obtuve de aquí:Publique tablas orientadas al paisaje con emulateapj en ArXiv. En particular, las líneas de código relevantes son las siguientes:

[...]
\clearpage
\global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 90}
[...]

Este código da como resultado que las páginas después de estas dos líneas se escriban en modo horizontal, mientras que las páginas anteriores a estas dos líneas se mantienen en modo vertical. no he investigadopor quéEsta macro funciona exactamente (y si lo hago, actualizaré esta respuesta), pero parece suficiente para lograr el objetivo establecido en la pregunta. En particular, tenga en cuenta que \clearpageno es crítico (espero que \pagebreakfuncione igual de bien), el punto es que podemos configurar la rotación de la página PDF restableciendo la \pdfpageattrmacro antes de que se envíe la página.

Ahora, miré la definición del turnpageentorno ( \ShowCommand{\turnpage}; \endturnpageno hace nada), y tenemos:

\turnpage =
  \def \width@float  {\textheight}
  \def \widthd@float {\textheight}
  \appdef \@endfloatbox
  {
    \@ifxundefined \@currbox
      {\ltxgrid@warn {Cannot rotate! Not a float}}
    {
      \setbox \@currbox \vbox to\textwidth
      {\vfil \unvbox \@currbox \vfil}
      \global\setbox \@currbox \vbox
      { \rotatebox{90}{\box \@currbox} }
    }
  }

donde los espacios en blanco son míos y para mayor claridad. Entonces, tenemos que el sidewaysentorno no hace nada demasiado especial, sino que establece un flotador del tamaño de una página y agrega algo de código para rotar el contenido del flotador. (Aquí, a saber, source2esec. P1.)

Suponiendo que este flotador siempre será enviado a la página siguiente (y no estoy completamente seguro de qué tan grande es esta suposición, pero funciona para mí en la práctica **), podemos hacer que este flotador se muestre en formato horizontal si Lo configuramos \pdfpageattrcorrectamente al comienzo de la página siguiente y luego restablecemos la orientación del PDF al comienzo de la página siguiente.

Lo logré aprovechando los ganchos de envío (a saber, lthooks-docy ltshipout-doc):

\appdef \turnpage {%
  % When we're declaring our turnpage float, instruct LaTeX to run
  % the following code after the current page has been finalized.
  \AddToHookNext{shipout/after}{%
    % Set the following page to be rotated by 90 degrees.
    \global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 90}%
    % Also, once this page is finalized (recalling that this is already
    % being called for the float's page), set the PDF attributes such that
    % the next pages are upright again.
    \AddToHookNext{shipout/after}{%
      \global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 0}%
    }%
  }%
}

Me sorprende lo robusto que parece ser esto (en el sentido casual, no en el sentido LaTeX); Realmente no se ha roto en absoluto en mi documento. Es importante destacar que lo estoy usando junto con un table*... el asterisco es fundamental. De lo contrario, incluso sin modificar revtex4, el posicionamiento del flotador está completamente roto.

Las advertencias habituales: de ninguna manera soy un experto en LaTeX (nunca me he molestado en leer el libro de TeX, si eso sirve de indicación), por lo que mucho de esto proviene de prueba y error. Esperemos que alguien con un conocimiento más profundo de TeX pueda corregir cualquier error en mi razonamiento.

Para mayor claridad, así es como se usaría este código en la práctica:

\documentclass{revtex4-2}
\usepackage{graphicx} % Necessary to use turnpage!

\appdef \turnpage {%
  % When we're declaring our turnpage float, instruct LaTeX to run
  % the following code after the current page has been finalized.
  \AddToHookNext{shipout/after}{%
    % Set the following page to be rotated by 90 degrees.
    \global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 90}%
    % Also, once this page is finalized (recalling that this is already
    % being called for the float's page), set the PDF attributes such that
    % the next pages are upright again.
    \AddToHookNext{shipout/after}{%
      \global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 0}%
    }%
  }%
}

\begin{document}

Start of the document...

\begin{turnpage}
\begin{table*}
  \caption{Caption of this table.}
  The contents of the table would go here.
\end{table*}
\end{turnpage}

...rest of the document

\end{document}

Mientras probaba esto, descubrí que se rompe si la página con el turnpageentorno es la única página del documento. Puede solucionar este problema de manera rápida y sucia experimentando usando shipout/beforeen lugar de shipout/afteren el archivo \appdef. Sin embargo, siempre que haya algún otro contenido, parece funcionar bien.

* Tu pregunta me parece perfectamente clara, la verdad. No estoy seguro de la fuente de la confusión.

** El único caso extremo que se me ocurre es cuando el sidewaysflotador está perfectamente colocado de modo que \pagebreakya ocurrió naturalmente antes de él, por lo que la páginadespuésen su lugar, se sidewaysgira. No estoy seguro de que esto realmente pueda suceder (probarlo insertando un \pagebreakjusto antes del flotador aún produce buenos resultados), pero debería ser fácil modificar el código que proporcioné para tratar ese caso específico, si es que alguna vez sucede. sucede.

información relacionada