graphicx,\rotatebox Исходная точка вращения находится в том же месте окружающего блока, где она находилась бы, если бы блок не был повернут

graphicx,\rotatebox Исходная точка вращения находится в том же месте окружающего блока, где она находилась бы, если бы блок не был повернут

Для иллюстрации я создал MWe, в котором в таблице есть ячейки, в которых поле, содержащее текст, вращается вокруг своей опорной точки.

Левый и правый столбцы содержат то же самое. Правый столбец дополнительно содержит несколько прямоугольников, чтобы вы могли видеть опорные точки исходных ящиков и измерения ящиков, полученных в результате вращения.

Если посмотреть на вторую строку, то кажется, что команда \rotateboxпакета graphicx оборачивает результат поворота в рамку.

При размещении в окружающем блоке блока, который доставляется командой \rotatebox-, я бы хотел, чтобы повернутая точка начала вращения оказалась в том же месте, где она оказалась бы, если бы блок не был повернут. Как можно увидеть в третьей строке таблицы результата компиляции примера ниже. (С mwe ниже, «окружающий блок» — это блок, содержащий содержимое ячейки таблицы, созданной табличной средой.)

Поскольку я выбрал особый случай, когда вращение выполняется вокруг опорной точки блока под углом 45 градусов против часовой стрелки, потребовалось некоторое «ручное» смещение/кернинг влево, которое можно было легко рассчитать.

Но я все еще задаюсь вопросом, не упустил ли я из виду менее громоздкий способ, который может быть описан в grfguide, позволяющий повернуть начало вращения в том же месте внутри окружающего блока, где оно оказалось бы, если бы блок не был повернут. (С учетом приведенного ниже mwe «окружающий блок» — это блок, содержащий содержимое ячейки таблицы, созданной табличной средой.)

(Для вычислений можно было бы поместить объекты в повернутые и неповернутые состояния, \phantomобернутые в коробки нулевой ширины/высоты/глубины, содержащие tikzpictures для хранения некоторых координат..., но мне интересно, есть ли какой-то простой способ сделать это, который я упустил из виду, читая grfguide.)

\documentclass{article}
\usepackage{graphicx, xcolor}

\ExplSyntaxOn\cs_new_eq:NN \fpeval \fp_eval:n\ExplSyntaxOff

\newbox\boxtorotate

\newlength\scratchy
\newcommand\Osepfbox[1]{{%
  \scratchy=\fboxsep
  \colorlet{saved}{.}%
  \fboxsep=-\fboxrule
  \color{lightgray}%
  \fbox{\fboxsep=\scratchy\color{saved}#1}%
}}%

\newcommand*\referencepointbox{%
  \hbox{%
    {%
      \color{lightgray}%
      \kern-\fboxrule \kern-\fboxsep \kern-.2pt
      \vbox{%
        \hbox{%
          \fbox{\vrule height 0.2pt depth 0.2pt width 0.4pt}%
        }%
        \kern-\prevdepth
      }%
      \kern-\fboxrule \kern-\fboxsep \kern-0.2pt
    }%
    \copy\boxtorotate
  }%
}%

\newcommand*\noreferencepointbox{\hbox{\copy\boxtorotate}}

\begin{document}

\setbox\boxtorotate=\hbox{Some text}

\begin{tabular}{|l|l|}
\hline&\\
\rlap{\noreferencepointbox}\rotatebox[x=0pt, y=0pt]{0}{\noreferencepointbox}&
\rlap{\referencepointbox}\Osepfbox{\rotatebox[x=0pt, y=0pt]{0}{\referencepointbox}}%
\\&\\
\hline&\\
\rlap{\noreferencepointbox}\rotatebox[x=0pt, y=0pt]{45}{\noreferencepointbox}&
\rlap{\referencepointbox}\Osepfbox{\rotatebox[x=0pt, y=0pt]{45}{\referencepointbox}}%
\\&\\
\hline&\\
\rlap{\noreferencepointbox}%
\kern-\fpeval{sqrt((\ht\boxtorotate)*(\ht\boxtorotate)*0.5)}pt 
\rotatebox[x=0pt, y=0pt]{45}{\noreferencepointbox}&
\rlap{\referencepointbox}%
\kern-\fpeval{sqrt((\ht\boxtorotate)*(\ht\boxtorotate)*0.5)}pt
\Osepfbox{\rotatebox[x=0pt, y=0pt]{45}{\referencepointbox}}%
\\&\\
\hline
\end{tabular}

\end{document}

введите описание изображения здесь

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