
В следующем 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 все еще дает хорошие результаты — но должно быть легко изменить код, который я предоставил, чтобы справиться с этим конкретным случаем, если он когда-нибудь произойдет.