ICHeinfachIch muss eine Textzeichenfolge abschneiden, die nur eine Zeichenfolge ohne Leerzeichen ist, daher funktioniert der Zeilenumbruch nicht. Ich muss nur die Länge der Zeichenfolge in Zentimetern festlegen, der Rest soll abgeschnitten werden.
Ich habe das Paket gefundenZierclipdas könnte es tun, aber ich brauche eine Möglichkeit, es ohne die Verwendung dieses Pakets zu tun (ich kann immer noch vorhandene, gängige Pakete verwenden)
Ich hoffe, es gibt noch eine andere Möglichkeit. Ich habe einesehr schöne Artdas geht, wenn du den Faden von der rechten Seite abschneiden willst. Ich brauche ihn aber von der anderen Seite.
Ich gebe ein kurzes Beispiel, wie mein Dokument aussehen sollte:
\documentclass{article}
\newcommand\magicCommand[1]{
...
}
\begin{document}
\begin{table}[htb]
\begin{center}
\begin{tabular}{l}
\begin{tabular}{|ll|}
\hline
\parbox{50mm}{ \magicCommand{3cm}{veryLongStringWhichIsGoingToLookUglyInMyDocument}} & \parbox{40mm}{ abc }\\
\hline
\end{tabular}
\end{tabular}
\end{center}
\end{table}
\end{document}
Der Text für das obige Beispiel sollte im Dokument wie folgt aussehen:
veryLongStri
\BEARBEITEN
Entschuldigen Sie diese lange Bearbeitung, aber ich bin ziemlich verwirrt. Das truncate
scheint irgendwie fehlerhaft zu sein (abhängig von der Zeichenfolge) und wie Sie sehen, habe ich einige andere Tests durchgeführt. Es gibt einige Lösungen, die ordnungsgemäß zu funktionieren scheinen. Ich weiß nicht, welches Problem ich vorher hatte, da einige Versionen nur außerhalb der Tabellenumgebungen funktionierten.
test.tex
\documentclass[10pt]{article}
\usepackage{a4,graphicx}
\usepackage[breakwords]{truncate}
\setlength{\oddsidemargin}{0cm}
\setlength{\evensidemargin}{0cm}
\setlength{\topmargin}{-2.0cm}
\setlength{\textwidth}{16cm}
\setlength{\textheight}{28.65cm}
\setlength{\headsep}{1.0cm}
\setlength{\parindent}{1.0cm}
\newcommand{\singlespace}{\renewcommand{\baselinestretch}{1.0}\small\normalsize}\newcommand{\doublespace}{\renewcommand{\baselinestretch}{1.5}\small\normalsize}
\renewcommand{\floatpagefraction}{0.95}
\renewcommand{\textfraction}{0.05}
\renewcommand{\topfraction}{0.95}
\renewcommand{\bottomfraction}{0.95}
%===new===
\newlength{\stringlen}
\newbox\stringbox
\newcommand{\clipstring}[2][6cm]{%
\setlength\stringlen{#1}%
\sbox\stringbox{}%
\doclipstring#2\doclipstring
}
\makeatletter
\newcommand{\doclipstring}[1]{%
\ifx#1\doclipstring
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox}%
{\check@cliplength{#1}}%
}
\def\check@cliplength#1{%
\sbox\stringbox{\unhcopy\stringbox #1}
\ifdim\wd\stringbox>\stringlen
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox\removetrailing}%
{\doclipstring}%
}
\def\removetrailing#1\doclipstring{}
\makeatother
%=========
\usepackage{xcolor}
\newcommand\tleft[3][white]{%
\setbox0=\hbox{\x}%
\makebox[#2][l]{%
\ooalign{\mbox{#3}\cr\kern#2\textcolor{#1}{%
\rule[-\dp0]{\wd0}{\dimexpr\dp0+\ht0}}}}%
}
%=========
\makeatletter
\newcommand\jw[2][2cm]{%
\leavevmode
\begingroup
\setbox0=\hbox{#2}%
\setbox0=\hbox{%
\pdfsave
\pdfliteral{%
0 \dim@in@bp{-\dp0 } \dim@in@bp{#1} \dim@in@bp{\ht0 + \dp0 }
re W n}%
\rlap{\box0 }%
\pdfrestore
\hskip#1 %
}%
\box0 %
\endgroup
}
\newcommand\dim@in@bp[1]{%
\strip@pt\dimexpr(#1) * 800/803\relax
}
\makeatother
%=========
\begin{document}
\pagestyle{empty}
\begin{table}[htb]
\begin{center}
\begin{tabular}{l}
\begin{tabular}{|ll|}
\hline
\parbox{60mm}{ thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap\_bad }& \parbox{80mm}{ 0.031 }\\
\parbox{60mm}{ \truncate{6cm}{qwfioqoiwefjiuwgwejfmqefiuhSiqwdMwqkdwqmkMqdwmDWmdwklqwdmlDMlkqwlkdMDLWQd} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{aaaaaaaa\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{truncate\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 2.047 }\\
\parbox{60mm}{ \truncate{6cm}{thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap\_good} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \clipstring{clipstring\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \tleft{6cm}{tleft\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \jw[6cm]{jw\_thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLikeCrap} }& \parbox{80mm}{ 1.023 }\\
\parbox{60mm}{ \jw[6cm]{jw\_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\_qqqq} }& \parbox{80mm}{ 1.023 }\\
\hline
\end{tabular}
\end{tabular}
\end{center}
\end{table}
\end{document}
testoutput
pdflatex.log
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
%&-line parsing enabled.
entering extended mode
(./test.tex
LaTeX2e <2005/12/01>
Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, arabic, basque, bulgarian, coptic, welsh, czech, slovak, german, ng
erman, danish, esperanto, spanish, catalan, galician, estonian, farsi, finnish,
french, greek, monogreek, ancientgreek, croatian, hungarian, interlingua, ibyc
us, indonesian, icelandic, italian, latin, mongolian, dutch, norsk, polish, por
tuguese, pinyin, romanian, russian, slovenian, uppersorbian, serbian, swedish,
turkish, ukenglish, ukrainian, loaded.
(/usr/share/texmf/tex/latex/base/article.cls
Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
(/usr/share/texmf/tex/latex/base/size10.clo))
(/usr/share/texmf/tex/latex/ntgclass/a4.sty)
(/usr/share/texmf/tex/latex/graphics/graphicx.sty
(/usr/share/texmf/tex/latex/graphics/keyval.sty)
(/usr/share/texmf/tex/latex/graphics/graphics.sty
(/usr/share/texmf/tex/latex/graphics/trig.sty)
(/usr/share/texmf/tex/latex/config/graphics.cfg)
(/usr/share/texmf/tex/latex/pdftex-def/pdftex.def)))
(/usr/share/texmf/tex/latex/ltxmisc/truncate.sty)
(/usr/share/texmf/tex/latex/xcolor/xcolor.sty
(/usr/share/texmf/tex/latex/config/color.cfg)) (./test.aux)
Overfull \hbox (194.49529pt too wide) in paragraph at lines 96--96
[]\OT1/cmr/m/n/10 thoseAreTheVeryLongStringsWeWantToCutOtherwiseTheTableLooksLi
keCrap[]bad
Overfull \hbox (207.60631pt too wide) detected at line 99
\OT1/cmr/m/n/10 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqq[]qqqq
Overfull \hbox (251.20644pt too wide) detected at line 100
\OT1/cmr/m/n/10 aaaaaaaa[]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqq[]qqqq
Overfull \hbox (3.02272pt too wide) in paragraph at lines 104--104
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][
]\OT1/cmr/m/n/10 c[]l[]i[]p[]s[]t[]r[]i[]n[]g[][][]t[]h[]o[]s[]e[]A[]r[]e[]T[]h
[]e[]V[]e[]r[]y[]L[]o[]n[]g[]S[]t[]r[]i[]n[]g[]s[]
! Undefined control sequence.
\\tleft [#1]#2#3->\setbox 0=\hbox {\x
}\makebox [#2][l]{\ooalign {\mbox {#3}...
l.106 ...antToCutOtherwiseTheTableLooksLikeCrap} }
& \parbox{80mm}{ 1.023 }\\
? [1{/usr/share/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) )</usr/sh
are/texmf/fonts/type1/bluesky/cm/cmr10.pfb>
Output written on test.pdf (1 page, 12123 bytes).
Transcript written on test.log.
Antwort1
Verwenden des truncate
Pakets
\documentclass{article}
\usepackage[breakwords]{truncate}
\begin{document}
\truncate{3cm}{This text has been~truncated}
\end{document}
Das Paket verwendet eine clevere Strategie, die auf Silbentrennung basiert. Aber ein Wort der Warnung: Wenn Sie einfach lange, sinnlose Buchstabenfolgen einfügen, kann es Probleme geben, einen Haltepunkt zu finden. Verwenden Sie sinnvollen Text und es funktioniert sehr gut. Lesen Sie die Dokumentation. Die Verwendung texdoc truncate
über die Befehlszeile ist der schnellste Weg.
Antwort2
Bei den meisten Boxmanipulationen können Sie sich auf beziehen, \width
das die natürliche Breite der Box enthält.
\documentclass{article}
\usepackage{trimclip}
\newcommand\clipstring[2][3cm]{%
\clipbox{0pt 0pt {\dimexpr\width-#1\relax} 0pt}{#2}%
}
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more
\end{document}
Ich habe ein optionales Argument zu hinzugefügt \clipstring
, sodass Sie die Länge zur Laufzeit beispielsweise mit anpassen können \clipstring[2cm]{...}
.
Möglicherweise möchten Sie ein Makro, das eine Zeichenfolge in Schreibmaschinenschrift ausschneidet und dabei die Anzahl der beizubehaltenden Zeichen angibt:
\documentclass{article}
\usepackage{trimclip}
\newcommand\clipstring[2][3cm]{%
\clipbox{0pt 0pt {\dimexpr\width-#1\relax} 0pt}{#2}%
}
\newcommand\clipttstring[2][10]{%
\texttt{\clipbox{0pt 0pt {\dimexpr\width-(#1em)/2\relax} 0pt}{#2}}%
}
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\clipttstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\texttt{0123456789} is not too long any more % check
\end{document}
Der Standardwert ist 10. Verwenden Sie \clipttstring[6]{...}
ihn, um nur sechs Zeichen zu behalten.
Hier ist stattdessen ein Makro, das den Druck von Zeichen stoppt, wenn die feste Länge überschritten wird.
\documentclass{article}
\newlength{\stringlen}
\newbox\stringbox
\newcommand{\clipstring}[2][3cm]{%
\setlength\stringlen{#1}%
\sbox\stringbox{}%
\doclipstring#2\doclipstring
}
\makeatletter
\newcommand{\doclipstring}[1]{%
\ifx#1\doclipstring
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox}%
{\check@cliplength{#1}}%
}
\def\check@cliplength#1{%
\sbox\stringbox{\unhcopy\stringbox #1}
\ifdim\wd\stringbox>\stringlen
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unhbox\stringbox\removetrailing}%
{\doclipstring}%
}
\def\removetrailing#1\doclipstring{}
\makeatother
\begin{document}
\clipstring{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\clipstring{shrt} is short
\end{document}
Einschränkungen: Das Argument muss eine Zeichenfolge aus einfachen ASCII-Zeichen sein, jedoch keine Leerzeichen und keine Buchstaben mit Akzent.
Eine ähnliche Lösung, allerdings mit der Anzahl der beizubehaltenden Zeichen (standardmäßig zehn).
\documentclass{article}
\makeatletter
\newcommand\stringclip[2][10]{%
\@tempcnta=#1\relax
\@tempcntb=\z@
\toks@={}%
\do@stringclip#2\do@stringclip
}
\def\do@stringclip#1{%
\ifx#1\do@stringclip
\the\toks@\expandafter\@gobble
\else
\advance\@tempcntb\@ne
\expandafter\@firstofone
\fi
{\check@one@more{#1}}%
}
\def\check@one@more#1{%
\ifnum\@tempcntb=\@tempcnta
\the\toks@ #1%
\expandafter\@firstoftwo
\else
\toks@=\expandafter{\the\toks@ #1}%
\expandafter\@secondoftwo
\fi
{\gobble@toend}%
{\do@stringclip}%
}
\def\gobble@toend#1\do@stringclip{}
\makeatother
\begin{document}
\stringclip{01234567890123456789}
\stringclip[5]{01234567890123456789}
\stringclip{012345}
\end{document}
Antwort3
Eine Lösung mit Box-Clipping auf Treiberebeneüber expl3
(Schnittstelle alsegregs Version):
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \clipstring { O { 2cm } m }
{
\erp_clip:nn {#2} {#1}
}
\box_new:N \l__erp_box
\cs_new_protected:Npn \erp_clip:nn #1#2
{
\leavevmode
\hbox_set:Nn \l__erp_box {#1}
\box_set_wd:Nn \l__erp_box {#2}
\box_clip:N \l__erp_box
\box_use:N \l__erp_box
}
\ExplSyntaxOff
\begin{document}
\clipstring[3cm]{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[3cm]{\hrulefill} is not too long any more % check
\end{document}
Wenn absolut keine Pakete erlaubt sind, können wir dasselbe tun, indem wir das Low-Level-Clipping „von Hand“ neu codieren. Dies ist an einen Treiber gebunden, aber das kann akzeptabel sein. Wenn Sie beispielsweise pdfTeX oder LuaTeX für die direkte PDF-Erstellung verwenden, lautet das oben „ausgeschriebene“
\documentclass{article}
\makeatletter
\newcommand\clipstring[2][2cm]{%
\leavevmode
\begingroup
\setbox0=\hbox{#2}%
\setbox0=\hbox{%
\pdfsave
\pdfliteral{%
0 \dim@in@bp{-\dp0 } \dim@in@bp{#1} \dim@in@bp{\ht0 + \dp0 }
re W n}%
\rlap{\box0 }%
\pdfrestore
\hskip#1 %
}%
\box0 %
\endgroup
}
\newcommand\dim@in@bp[1]{%
\strip@pt\dimexpr(#1) * 800/803\relax
}
\makeatother
\begin{document}
\clipstring[2.95cm]{veryLongStringWhichIsGoingToLookUglyInMyDocument} is
not too long any more
\makebox[2.95cm]{\hrulefill} is not too long any more % check
\end{document}
(Ich habe ein paar kleinere Änderungen vorgenommen, da ich in diesem Fall einige Dinge fest codieren kann, die beim Schreiben des expl3
Treibercodes nicht möglich sind!)
Antwort4
Dies verwendet xcolor
anstelle von trimclip
. Wie egreg richtig anmerkt, funktioniert meine ursprüngliche Antwort auf einem farbigen Hintergrund nicht. Daher habe ich es BEARBEITET, um ein optionales Argument hinzuzufügen, mit dem die Hintergrundfarbe angegeben werden kann (Standard: Weiß).
BEARBEITET, um die lokale Variable \x
innerhalb der \tleft
Definition durch (oops!) zu ersetzen #3
.
\documentclass{article}
\usepackage{xcolor}
\newcommand\tleft[3][white]{%
\setbox0=\hbox{#3}%
\makebox[#2][l]{%
\ooalign{\mbox{#3}\cr\kern#2\textcolor{#1}{%
\rule[-\dp0]{\wd0}{\dimexpr\dp0+\ht0}}}}%
}
\begin{document}
\def\x{This is my very long string}
\x
\rule{1.4cm}{2pt}
\tleft{1.4cm}{\x}NEXT
\end{document}