revtex и turnpage: также поворачивают вид страницы PDF на 90 градусов в горизонтальное положение

revtex и turnpage: также поворачивают вид страницы PDF на 90 градусов в горизонтальное положение

В следующем revtex4, можем ли мы сделать так, чтобы переворачивание страницы также поворачивало вид страницы PDF на 90 градусовгоризонтальныйориентация (больше, чем просто поворот содержимого на 90 градусов, но сохранение страницы прежней)вертикальныйориентация)?

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

\begin{turnpage}

\begin{figure} or 
\begin{table}

[...]

\end{figure} or \end{table}

\end{turnpage}

Другие похожие функции:

\usepackage{lscape} 

\begin{landscape} 

\end{landscape} 

решение1

Переформулирую вопрос, как я его понял, поскольку в комментариях, похоже, есть некоторая путаница: revtex4( 4-1и 4-2) предоставляют turnpageсреду, которая набирает содержимое в альбомной ориентации. Однако PDF по-прежнему показывает альбомную страницу в книжной ориентации. Вы хотели бы, чтобы эта страница не только была набрана в альбомной ориентации, но и отображалась в той же ориентации.*

Мне удалось добиться этого с помощью некоего «волшебного кода», который я взял отсюда:Публикация таблиц с альбомной ориентацией с помощью emulateapj на ArXiv. В частности, соответствующие строки кода следующие:

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

Этот код приводит к тому, что страницы после этих двух строк набираются в альбомной ориентации, а страницы до этих двух строк остаются в портретной ориентации. Я не рассматривалпочемуэтот макрос работает точно (и если я это сделаю, я обновлю этот ответ), но этого, кажется, достаточно для достижения цели, указанной в вопросе. В частности, обратите внимание, что не \clearpageкритично -- я ожидаю, что \pagebreakработает так же хорошо -- суть в том, что мы можем задать поворот для страницы PDF, переустановив макрос \pdfpageattrперед отправкой страницы.

Теперь я посмотрел на определение среды turnpage( \ShowCommand{\turnpage}; \endturnpageничего не делает), и у нас есть:

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

где пробелы мои и для ясности. Итак, у нас есть, что sidewaysсреда не делает ничего особенного, а просто устанавливает плавающий объект размером со страницу и добавляет некоторый код для поворота содержимого плавающего объекта. (Здесь, а именно, source2eраздел P1.)

Предполагая, что этот плавающий элемент всегда будет перемещаться на следующую страницу (и я не совсем уверен, насколько это предположение верно, но на практике у меня это работает**), мы можем заставить этот плавающий элемент отображаться в альбомной ориентации, если правильно установим его \pdfpageattrв начале следующей страницы, а затем сбросим ориентацию PDF в начале следующей страницы.

Я добился этого, используя хуки shipout (а именно, lthooks-docи 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}%
    }%
  }%
}

Я удивлен, насколько это надежно (в неформальном смысле, а не в смысле LaTeX); в моем документе это действительно не сломалось. Важно, что я использую его вместе с table*-- звездочка имеет основополагающее значение. В противном случае, даже с неизмененным revtex4, позиционирование плавающего элемента полностью сломано.

Обычные предостережения: я ни в коем случае не эксперт по LaTeX (я никогда не удосужился прочитать книгу TeX, если это хоть какой-то показатель), так что многое из этого приходит методом проб и ошибок. Надеюсь, кто-то с более глубоким пониманием TeX сможет исправить любые ошибки в моих рассуждениях.

Для ясности вот как можно использовать этот код на практике:

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

Во время тестирования я обнаружил, что это ломается, если страница с turnpageокружением является единственной страницей в документе. Вы можете исправить это на скорую руку, поэкспериментировав с использованием shipout/beforeвместо shipout/afterв \appdef. Однако, пока есть какой-то другой контент, это, похоже, работает нормально.

* Ваш вопрос кажется мне совершенно ясным, если честно. Я не уверен в источнике путаницы.

** Единственный крайний случай, который я могу придумать, это когда sidewaysплавающий объект идеально размещен таким образом, что a \pagebreakуже естественным образом возник перед ним, и поэтому страницапослевместо этого sidewaysповорачивается. Я не уверен, что это может произойти на самом деле — тестирование путем вставки a \pagebreakнепосредственно перед float все еще дает хорошие результаты — но должно быть легко изменить код, который я предоставил, чтобы справиться с этим конкретным случаем, если он когда-нибудь произойдет.

Связанный контент