Text von links nach rechts abschneiden

Text von links nach rechts abschneiden

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 truncatescheint 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

Bildbeschreibung hier eingeben

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 truncatePakets

\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, \widthdas 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]{...}.

Bildbeschreibung hier eingeben

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.

Bildbeschreibung hier eingeben


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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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 expl3Treibercodes nicht möglich sind!)

Antwort4

Dies verwendet xcoloranstelle 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 \xinnerhalb der \tleftDefinition 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}

Bildbeschreibung hier eingeben

verwandte Informationen