parbox 内部的文本对齐方式与所在环境相同

parbox 内部的文本对齐方式与所在环境相同

如何\parbox“继承”调用它的环境中使用的“对齐模式”?换句话说,如何将文本对齐设置自动化\parbox,以便采用与主段落相同的文本对齐方式?

我正在考虑用三if/then句话来表示左、右或中间的“模式”,但我不知道如何“获取” latex 当时使用的“当前”值。我的意思是,像这样:

\begin{center}
Some text here
\if@... \parbox{0.5\textwidth}{\centering Some text here}
\if@... \parbox{0.5\textwidth}{\raggedright ...}
\if@... \parbox{0.5\textwidth}{\raggedleft ...}
Some text here
\end{center}

我希望它在两种环境(\begin{center}...)和声明(\centering)下都能工作

答案1

查看\meaning各种 (4) 种模式的 ,可以看到 2 个长度 \parfillskip\rightskip组合起来构成了每种模式的唯一标识符。因此,只需使用保存在字符串中的这两个长度的表达式,通过\ifx比较进行识别即可。

然后,我介绍了\justparbox一种用于检查和设置周围环境理由的工具\parbox

其限制在于它不能在\rightskip被改变的地方使用,例如在某些列表环境中。

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\xdef\justcase{\the\parfillskip,\the\rightskip}
{\raggedright\xdef\ragrcase{\the\parfillskip,\the\rightskip}}
{\raggedleft\xdef\raglcase{\the\parfillskip,\the\rightskip}}
{\centering\xdef\cencase{\the\parfillskip,\the\rightskip}}
\newcommand\justparbox[3][c]{\xdef\tmp{\the\parfillskip,\the\rightskip}%
  \ifx\tmp\ragrcase\parbox[#1]{#2}{\raggedright#3}\else
  \ifx\tmp\raglcase\parbox[#1]{#2}{\raggedleft#3}\else
  \ifx\tmp\cencase\parbox[#1]{#2}{\centering#3}\else
    \parbox[#1]{#2}{#3}\fi\fi\fi}
\begin{document}
\meaning\centering

\meaning\raggedright

\meaning\raggedleft

\hrulefill

\newcommand\mydata{\lipsum[4]\par\justparbox[t]{5in}{\lipsum[4]}%
  \par\noindent\hrulefill\par}

\mydata
{\raggedright\mydata}
{\raggedleft\mydata}
{\centering\mydata}
\end{document}

在此处输入图片描述

答案2

TeX 没有\ifskip比较器,但我们可以模拟它。

\documentclass{article}
\usepackage{pdftexcmds}

\usepackage{lipsum}

\makeatletter
\newcommand{\equalskipTF}[2]{%
  \ifnum\pdf@strcmp{\the\glueexpr#1\relax}{\the\glueexpr#2}=\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\newcommand{\testrlcenrr}{%
  \equalskipTF{\rightskip}{\@flushglue}%
    {% either center or raggedright
     \equalskipTF{\leftskip}{\@flushglue}%
      {% center
       \let\rl@cen@rr\centering
      }%
      {% raggedright
       \let\rl@cen@rr\raggedright
      }%
    }%
    {% either raggedleft or justified
     \equalskipTF{\leftskip}{\@flushglue}
      {% raggedleft
       \let\rl@cen@rr\raggedleft
      }
      {% justified
       \let\rl@cen@rr\relax
      }%
    }%
}
\newcommand{\pparbox}[3][c]{%
   \testrlcenrr
   \parbox[#1]{#2}{\rl@cen@rr#3}%
}

\begin{document}

\section{Normal text}

\lipsum[2][1-3]

\bigskip

\noindent
\pparbox{10cm}{\lipsum[1][1-3]}

\section{Ragged right}

\begin{flushleft}
\lipsum[2][1-3]    

\bigskip

\pparbox{10cm}{\lipsum[1][1-3]}
\end{flushleft}

\section{Center}

\begin{center}
\lipsum[2][1-3]    

\bigskip

\pparbox{10cm}{\lipsum[1][1-3]}
\end{center}

\section{Ragged left}

\begin{flushright}
\lipsum[2][1-3]    

\bigskip

\pparbox{10cm}{\lipsum[1][1-3]}
\end{flushright}

\end{document}

在此处输入图片描述

解释。

  1. \centering具有两者\leftskip\rightskip设置为\@flushglue
  2. \raggedright左跳跃为零,并且\rightskip=\@flushglue
  3. \raggedleft右跳跃为零,并且\leftskip=\@flushglue

相关内容