วิธีการตัดข้อความในตารางน้ำยาง?


456

ฉันกำลังสร้างรายงานใน LaTeX ที่เกี่ยวข้องกับตารางไม่กี่ตาราง ฉันติดอยู่กับที่เนื่องจากข้อมูลเซลล์ของฉันในตารางเกินความกว้างของหน้า ฉันสามารถห่อข้อความเพื่อให้มันอยู่ในบรรทัดถัดไปในเซลล์เดียวกันของตารางได้หรือไม่?

มันเกี่ยวข้องกับความกว้างของตารางหรือไม่? แต่เนื่องจากเป็นการแก้ไขความกว้างของหน้ามันจะสร้างความแตกต่างหรือไม่


ผมกำลังมองหาวิธีที่จะตัดคำยาวการแก้ปัญหาอื่น ๆ ที่ดีกว่าเหมาะสมกับความต้องการของฉัน tex.stackexchange.com/questions/198325/wrap-word-in-table-cell
มิแรนดา

คำตอบ:


516

ใช้ p {width} สำหรับตัวระบุคอลัมน์แทน l / r / c

\begin{tabular}{|p{1cm}|p{3cm}|}
  This text will be wrapped & Some more text \\
\end{tabular}

37
ทางออกที่ดี แต่เสีย '|' หากคุณไม่ต้องการเส้นขอบรอบโต๊ะ จากนั้นมันจะกลายเป็น\begin{tabular}{p{1cm}p{3cm}}
Andrejas

83
มีวิธีใดบ้างในขณะที่ยังระบุการจัดตำแหน่งในแต่ละเซลล์
Dylan Knowles

7
ฉันพบวิธีระบุการจัดตำแหน่งในแต่ละเซลล์! สร้างมาโคร! \ newcolumntype {L} {> {\ centering \ arraybackslash} m {.8cm}} \ start {table *} [t]% \ small \ caption {การเปรียบเทียบ} \ การจัดกึ่งกลาง% \ start {tabular} {| L | L | L | L | L | L | L | L | L | L | L | L | L |}
Veridian

8
จะเกิดอะไรขึ้นถ้าฉันมีสองคอลัมน์โดยที่คอลัมน์แรกควรยาวเท่าที่จำเป็นเพื่อให้พอดีกับเนื้อหาและอีกคอลัมน์ควรเติมให้เต็มความกว้างของบรรทัดขณะตัดคำ โดยพื้นฐานแล้วฉันต้องการbegin{tabular}{lp{<whatever is left to fill the line width>}}
Sander

118
ทางออกที่ดี อย่างไรก็ตามฉันขอแนะนำให้ใช้ค่าสัมพัทธ์แทนมิติข้อมูลโดยพลการเช่นp{0.2\linewidth}p{0.6\linewidth}}
jgyou

141

ด้วยtabularสภาพแวดล้อมปกติคุณต้องการใช้p{width}ประเภทคอลัมน์ตามที่ Marcog ระบุ แต่นั่นบังคับให้คุณให้ความกว้างอย่างชัดเจน

วิธีการแก้ปัญหาก็คือtabularxสภาพแวดล้อม:

\usepackage{tabularx}
...
\begin{tabularx}{\linewidth}{ r X }
    right-aligned foo & long long line of blah blah that will wrap when the table fills the column width\\
\end{tabularx}

คอลัมน์ X ทั้งหมดมีความกว้างเท่ากัน คุณสามารถมีอิทธิพลต่อสิ่งนี้โดยการตั้งค่า\hsizeในการประกาศรูปแบบ:

>{\setlength\hsize{.5\hsize}} X >{\setlength\hsize{1.5\hsize}} X

แต่แล้วปัจจัยทั้งหมดต้องรวมกันเป็น 1 ฉันคิดว่า (ฉันเอาสิ่งนี้มาจากคู่หูน้ำยาง) นอกจากนี้ยังมีแพ็คเกจtabularyที่จะปรับความกว้างคอลัมน์เพื่อปรับความสูงของแถว สำหรับรายละเอียดคุณสามารถรับเอกสารสำหรับแต่ละแพ็คเกจด้วยtexdoc tabulary(ใน TeXlive)


3
น่าสนใจว่ามันมีประโยชน์จริงๆ มันฉลาดแค่ไหนเมื่อพูดถึงการเลือกความกว้างของคอลัมน์? ตัวอย่างเช่นหากคุณมีสองคอลัมน์ที่จำเป็นต้องห่อ แต่อีกคอลัมน์หนึ่งที่มีข้อความยาวกว่าอีกคอลัมน์หนึ่งจะยังคงกำหนดความกว้างเท่ากันหรือไม่
moinudin

2
ฉันแก้ไขคำตอบของฉัน แต่ที่จริงแล้วในทางปฏิบัติฉันลองทำให้โต๊ะของฉันง่ายขึ้นเพื่อที่ฉันจะต้องใช้ X สำหรับคอลัมน์เดียว ฉันเพิ่งค้นพบ tabulary :)
ดาเมียน Pollet

51

อีกทางเลือกหนึ่งคือการแทรก minipage ในแต่ละเซลล์ที่ต้องการตัดข้อความเช่น:

\begin{table}[H]
\begin{tabular}{l}
\begin{minipage}[t]{0.8\columnwidth}%
a very long line a very long line a very long line a very long line
a very long line a very long line a very long line a very long line
a very long line a very long line a very long line %
\end{minipage}\tabularnewline
\end{tabular}
\end{table}

8
ขอบคุณสิ่งนี้ทำให้ฉันสามารถวางitemizeรายการในเซลล์ของฉัน
Quentin Pradet

ฉันคิดว่าคำตอบควรอธิบายความหมายของ\columnwidth: เมื่อฉันลองมันดูเหมือนว่าจะเป็นความกว้างของตารางมากกว่าความกว้างของคอลัมน์ดังนั้นฉันจึงต้องกำหนดสัดส่วนแบบแมนนวล0.2\columnwidthเพื่อให้ได้ความกว้างที่เหมาะสม
U. Windl

38

ฉันชอบความเรียบง่ายของtabularyแพคเกจ:

\usepackage{tabulary}
...
\begin{tabulary}{\linewidth}{LCL}
    \hline
    Short sentences      & \#  & Long sentences                                                 \\
    \hline
    This is short.       & 173 & This is much loooooooonger, because there are many more words.  \\
    This is not shorter. & 317 & This is still loooooooonger, because there are many more words. \\
    \hline
\end{tabulary} 

ในตัวอย่างคุณจัดเรียงความกว้างทั้งหมดของตารางด้วยความเคารพ \ textwidth เช่น 0.4 ของมัน จากนั้นแพคเกจที่เหลือจะทำโดยอัตโนมัติ

ส่วนใหญ่ของตัวอย่างที่นำมาจากhttp://en.wikibooks.org/wiki/LaTeX/Tables


21

เรียบง่ายเหมือนเค้กชิ้นหนึ่ง!

คุณสามารถกำหนดคอลัมน์ชนิดใหม่ ๆ เช่น ( Lในกรณีนี้) ในขณะที่การรักษาการจัดตำแหน่งปัจจุบัน ( c, rหรือl):

\documentclass{article}
\usepackage{array}
\newcolumntype{L}{>{\centering\arraybackslash}m{3cm}}

\begin{document}

\begin{table}
    \begin{tabular}{|c|L|L|}
        \hline
        Title 1 & Title 2 & Title 3 \\
        \hline 
        one-liner & multi-line and centered & \multicolumn{1}{m{3cm}|}{multi-line piece of text to show case a multi-line and justified cell}   \\
        \hline
        apple & orange & banana \\
        \hline
        apple & orange & banana \\
        \hline
    \end{tabular}
\end{table}
\end{document}

ป้อนคำอธิบายรูปภาพที่นี่


5

ถ้าคุณต้องการล้อมรอบข้อความของคุณ แต่คงไว้ซึ่งการจัดตำแหน่งคุณสามารถล้อมเซลล์นั้นในสภาพแวดล้อมminipageหรือvarwidth(ความกว้างมาจากแพ็คเกจความกว้าง) ความกว้างจะเป็น "กว้างเท่ากับเนื้อหา แต่ไม่กว้างกว่า X" คุณสามารถสร้างประเภทคอลัมน์ที่กำหนดเองซึ่งทำหน้าที่เหมือน "p {xx}" แต่ย่อขนาดให้พอดีโดยใช้

\newcolumntype{M}[1]{>{\begin{varwidth}[t]{#1}}l<{\end{varwidth}}}

ซึ่งอาจต้องใช้arrayแพ็คเกจ จากนั้นเมื่อคุณใช้บางอย่างเช่น\begin{tabular}{llM{2in}}สองคอลัมน์แรกเราจะจัดชิดซ้ายตามปกติและคอลัมน์ที่สามจะจัดชิดซ้ายตามปกติ แต่ถ้ากว้างกว่า 2 นิ้วข้อความจะถูกจัดเรียง


1

ในการเปลี่ยนข้อความABเข้าไปในเซลล์ตารางวางนี้ในตำแหน่งมือถือ:A \r B\makecell{A \\ B}

ก่อนที่จะทำเช่นนั้นคุณต้องมีแพ็คเกจmakecellด้วย


-12
\begin{table}
 \caption{ Example of force text wrap}
 \begin{center}
  \begin{tabular}{|c|c|}
   \hline
   cell 1       &   cell 2 \\   \hline
   cell 3                &       cell 4 & & very big line that needs to be wrap. \\ \hline
   cell 5       &   cell 6 \\   \hline
  \end{tabular}
  \label{table:example}
 \end{center}
\end{table}

downvote นี่เป็นคำตอบเฉพาะโค้ดเท่านั้นโดยไม่มีคำอธิบายเลย
starbeamrainbowlabs

1
ยิ่งไปกว่านั้นมันเป็นความผิดอยู่ดีเนื่องจากแถวที่สองมี 4 เซลล์ซึ่งตารางถูกออกแบบมาเพื่อรองรับสองคอลัมน์เท่านั้น และไม่เกี่ยวข้องกับการห่อเนื้อหาของเซลล์ แต่อย่างใด
อาเหม็ดซาลาห์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.