表格内的文本宽度

表格内的文本宽度

我正在使用表格来格式化一本书的页面,每页有 6 个棋子位置。我希望位置对齐,如果文本较短,它就可以正常工作,但对于我有较长移动序列的位置,它会影响表格对齐。我想要做的是设置文本的最大宽度,这样它就会自动转到新行而不会破坏水平间距,但我尝试过的文本宽度设置似乎不适用于表格内部。

好页面(板对齐):

好页面

坏页(较长的序列破坏了对齐):

坏页面

代码示例:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{skak}
\usepackage{chessboard}
\usepackage{makecell}

\begin{document}
\begin{center}

    \begin{tabular}{cc}

    
      \makecell{
      \textbf{ Analysis Position } 2014\\
      \textbf{ 1 }\chessboard[setfen= r1bqkb1r/pp3ppp/2n1pn2/2pp2B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R b KQkq - 0 6, smallboard, showmover]\\
      \textbf{ 6...c4 }
      }
      
    
      \makecell{
      \textbf{ Uesugi - Perelshteyn } 2009\\
      \textbf{ 2 }\chessboard[setfen= r1r3k1/qp3pbp/p2p1np1/3Pp3/NP2P3/P2Q1BPP/5P2/R4RK1 w - - 0 19, smallboard, showmover]\\
      \textbf{ 19. g4 }
      }
      
      \vspace{0.25cm}
      \\
      
    
      \makecell{
      \textbf{ Perelshteyn - Onischuk } 2010\\
      \textbf{ 3 }\chessboard[setfen= r1bqk2r/pp4bp/2pp2p1/5pP1/2P2Nn1/2N1P3/PPQ2PP1/2KR1B1R w kq - 0 13, smallboard, showmover]\\
      \textbf{ 13. c5 d5 14. Ncxd5 cxd5 }
      }
      
    
      \makecell{
      \textbf{ Spassky - Petrosian } 1966\\
      \textbf{ 4 }\chessboard[setfen= 2kr3r/pbqnbp2/1p2p3/2ppP2p/PP3B1p/2PBPN2/5PP1/R2Q1RK1 b - - 0 17, smallboard, showmover]\\
      \textbf{ 17...c4 18. Be2 a6 }
      }
      
      \vspace{0.25cm}
      \\
      
    
      \makecell{
      \textbf{ Yang - Perelshteyn } 2010\\
      \textbf{ 5 }\chessboard[setfen= rnbq1rk1/5pbp/p2p1np1/2p5/1p1PP1P1/4BP2/PP1QN2P/R2NKB1R w KQ - 0 13, smallboard, showmover]\\
      \textbf{ 13. dxc5 dxc5 14. Qxd8 Rxd8 15. Bxc5 }
      }
      
    
      \makecell{
      \textbf{ Carlsen - Amonatov } 2018\\
      \textbf{ 6 }\chessboard[setfen= 1qr1rn2/1b1n1pbk/pBp3pp/Pp2p3/1PP1P3/3B1NNP/5PP1/R1QR2K1 w - - 0 24, smallboard, showmover]\\
      \textbf{ 24. c5 }
      }
      
      \end{tabular}
      \newpage

答案1

我建议使用具有六个参数的宏\twoboards:标题、板、左图像的移动和标题、板、右图像的移动。

我们不需要任何表格环境。每个\twoboards都有\centerline两个对象\singleboad。这些对象的宽度固定为 120pt,它们之间用 分隔\hss\hss。因为\centerline这样,\hbox to\hsize{\hss #1\hss}我们将第一个对象\singeboard放在左半部分的中心\hsize,将第二个对象放在右半部分的中心。

每个\singleboard都是\vtop,因此它们按第一行(即按标题)垂直对齐。 的内部参数\vtop为:\hsize=120pt\leftskip\rightskip以便将最后一段移动到给定的 的中心\hsize

\def\twoboards#1#2#3#4#5#6{\par
   \centerline{\singleboard{#1}{#2}{#3}\hss\hss \singleboard{#4}{#5}{#6}}
   \bigskip
}
\def\singleboard#1#2#3{%
   \vtop{\hsize=120pt \leftskip=0pt plus1fil \rightskip=\leftskip \parfillskip=0pt 
      \centerline{\bf\ignorespaces #1\unskip}
      \vskip-8pt
      \centerline{\ignorespaces #2\unskip}
      \noindent\bf \ignorespaces #3\par}%
}

\twoboards
   { Analysis Position  2014 }
   { 1 \chessboard[setfen= r1bqkb1r/pp3ppp/2n1pn2/2pp2B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R b KQkq - 0 6, smallboard, showmover] }
   { 6...c4 }
   %
   { Uesugi - Perelshteyn 200 }
   { 2 \chessboard[setfen= r1r3k1/qp3pbp/p2p1np1/3Pp3/NP2P3/P2Q1BPP/5P2/R4RK1 w - - 0 19, smallboard, showmover] }
   { 19. g4 }

\twoboards
   { Perelshteyn - Onischuk  2010 }
   { 3 \chessboard[setfen= r1bqk2r/pp4bp/2pp2p1/5pP1/2P2Nn1/2N1P3/PPQ2PP1/2KR1B1R w kq - 0 13, smallboard, showmover] }
   { 13. c5 d5 14. Ncxd5 cxd5 }
   %
   { Spassky - Petrosian  1966 }
   { 4 \chessboard[setfen= 2kr3r/pbqnbp2/1p2p3/2ppP2p/PP3B1p/2PBPN2/5PP1/R2Q1RK1 b - - 0 17, smallboard, showmover] }
   { 17...c4 18. Be2 a6 }

\twoboards
   { Yang - Perelshteyn  2010 }
   { 5 \chessboard[setfen= rnbq1rk1/5pbp/p2p1np1/2p5/1p1PP1P1/4BP2/PP1QN2P/R2NKB1R w KQ - 0 13, smallboard, showmover] }
   { 13. dxc5 dxc5 14.~Qxd8 Rxd8 15. Bxc5 }
   %
   { Carlsen - Amonatov  2018 }
   { 6 \chessboard[setfen= 1qr1rn2/1b1n1pbk/pBp3pp/Pp2p3/1PP1P3/3B1NNP/5PP1/R1QR2K1 w - - 0 24, smallboard, showmover] }
   { 24. c5 }

要理解这个解决方案,我们需要知道的一切是 TeX 原始命令\hbox、、和TeX 原始寄存器、以及所有格式中共同定义的宏。\vtop\hss\vskip\hsize\leftskip\rightskip\centerline

答案2

您没有正确设置tabularmargins。我定义了一种具有固定宽度和居中对齐的新列类型P。我将边距设置为 2cm(顶部、底部、左侧和右侧),并使用showframe包显示页面框架。您的内容现在位于页面的中心。如果任何单元格的内容较长,它将可拆分并居中对齐。

\documentclass{article}
\usepackage[margin=2cm]{geometry}
\usepackage{showframe}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{skak}
\usepackage{chessboard}
\usepackage{makecell}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}

\begin{document}
\null\vfill{\centering
\begin{tabular}{cc}
\makecell[{{P{6cm}}}]{
\textbf{ Analysis Position } 2014\\
\textbf{ 1 }\chessboard[setfen= r1bqkb1r/pp3ppp/2n1pn2/2pp2B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R b KQkq - 0 6, smallboard, showmover]\\
\textbf{ 6...c4 }
}&
\makecell[{{P{6cm}}}]{
\textbf{ Uesugi - Perelshteyn } 2009\\
\textbf{ 2 }\chessboard[setfen= r1r3k1/qp3pbp/p2p1np1/3Pp3/NP2P3/P2Q1BPP/5P2/R4RK1 w - - 0 19, smallboard, showmover]\\
\textbf{ 19. g4 }
}\vspace{0.25cm}\\
\makecell[{{P{6cm}}}]{
\textbf{ Perelshteyn - Onischuk } 2010\\
\textbf{ 3 }\chessboard[setfen= r1bqk2r/pp4bp/2pp2p1/5pP1/2P2Nn1/2N1P3/PPQ2PP1/2KR1B1R w kq - 0 13, smallboard, showmover]\\
\textbf{ 13. c5 d5 14. Ncxd5 cxd5 }
}&
\makecell[{{P{6cm}}}]{
\textbf{ Spassky - Petrosian } 1966\\
\textbf{ 4 }\chessboard[setfen= 2kr3r/pbqnbp2/1p2p3/2ppP2p/PP3B1p/2PBPN2/5PP1/R2Q1RK1 b - - 0 17, smallboard, showmover]\\
\textbf{ 17...c4 18. Be2 a6 }
}\vspace{0.25cm}\\
\makecell[{{P{6cm}}}]{
\textbf{ Yang - Perelshteyn } 2010\\
\textbf{ 5 }\chessboard[setfen= rnbq1rk1/5pbp/p2p1np1/2p5/1p1PP1P1/4BP2/PP1QN2P/R2NKB1R w KQ - 0 13, smallboard, showmover]\\
\textbf{ 13. dxc5 dxc5 14. Qxd8 Rxd8 15. Bxc5 sdfsdfsdfs}
}&    
\makecell[{{P{6cm}}}]{
\textbf{ Carlsen - Amonatov } 2018\\
\textbf{ 6 }\chessboard[setfen= 1qr1rn2/1b1n1pbk/pBp3pp/Pp2p3/1PP1P3/3B1NNP/5PP1/R1QR2K1 w - - 0 24, smallboard, showmover]\\
\textbf{ 24. c5 }
}
\end{tabular}\par}\vfill
\end{document}

输出:

在此处输入图片描述

答案3

通过使用表格的两列,您可以更好地控制棋盘的布局和对齐。(并减少打字)

每个游戏有三行:标题、棋盘和走法。

中心和粗体都在列的定义中。添加了一个可选的新命令 \moves,以保持移动的宽度接近棋盘的宽度(定义为 15*8pt skak),如果需要的话。

请注意~最后一行使用的,14.~Qxd8以避免行中出现孤独的数字。

d

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{skak}
\usepackage{chessboard}

%************************************ added
\usepackage{array}
\newcolumntype{C}{@{}>{\centering\bfseries\arraybackslash}p{0.5\linewidth}@{}}

\newcommand{\moves}[1]{% set the width of moves close to the chessboard 120pt
    \parbox[t]{120pt}{\centering #1}
    }   

%************************************

\begin{document}
\centering

\begin{tabular}{CC}
        
    Analysis Position  2014                         &   Uesugi - Perelshteyn 2009\\[-0.3cm]
    1 \chessboard[setfen= r1bqkb1r/pp3ppp/2n1pn2/2pp2B1/3P4/2P1PN2/PP1N1PPP/R2QKB1R b KQkq - 0 6, smallboard, showmover]&   
    2 \chessboard[setfen= r1r3k1/qp3pbp/p2p1np1/3Pp3/NP2P3/P2Q1BPP/5P2/R4RK1 w - - 0 19, smallboard, showmover]  \\ 
    \moves{ 6...c4 }                                &  \moves{ 19. g4 }\\[0.50cm]% add vertical space
    
    Perelshteyn - Onischuk  2010                    &    Spassky - Petrosian  1966\\[-0.3cm]
    3 \chessboard[setfen= r1bqk2r/pp4bp/2pp2p1/5pP1/2P2Nn1/2N1P3/PPQ2PP1/2KR1B1R w kq - 0 13, smallboard, showmover]&   
    4 \chessboard[setfen= 2kr3r/pbqnbp2/1p2p3/2ppP2p/PP3B1p/2PBPN2/5PP1/R2Q1RK1 b - - 0 17, smallboard, showmover] \\
    \moves{ 13. c5 d5 14. Ncxd5 cxd5 }              & \moves{ 17...c4 18. Be2 a6 }\\[0.70cm]% add vertical space
    
    Yang - Perelshteyn  2010                        &  Carlsen - Amonatov  2018\\[-0.3cm]
    5 \chessboard[setfen= rnbq1rk1/5pbp/p2p1np1/2p5/1p1PP1P1/4BP2/PP1QN2P/R2NKB1R w KQ - 0 13, smallboard, showmover]&
    6 \chessboard[setfen= 1qr1rn2/1b1n1pbk/pBp3pp/Pp2p3/1PP1P3/3B1NNP/5PP1/R1QR2K1 w - - 0 24, smallboard, showmover]\\
    \moves{ 13. dxc5 dxc5 14.~Qxd8 Rxd8 15. Bxc5}   &    \moves{ 24. c5 }   
    
\end{tabular}

相关内容