Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

LaTeX jak rozpocząć od nowej strony jeśli jest mało miejsca.

2,385 views
Skip to first unread message

Czarek Grądys

unread,
Feb 10, 2015, 5:49:12 AM2/10/15
to
Witam.
Pewnie proste, ale jakoś się męczę z tym. Chciałbym, żeby jeśli zostało
mało miejsca na dole strony rozpocząć od nowej strony.
Mam długą tabelę o nieznanej długości (longtable), po niej
'\subsection'. Czyli jeśli tabela się skończy i jest powiedzmy mniej niż
1/3 wolnej strony to zaczyna od nowej strony.

Próbowałem \vbox ale to powoduje, że strona się nie kończy i tabelka
wyłazi poza stronę.






--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 10, 2015, 7:18:37 AM2/10/15
to
Pan Czarek Grądys napisał:

> Pewnie proste, ale jakoś się męczę z tym.

Właśnie nie takie proste. TeX znakomicie radzi sobie ze znalezieniem
optymalnych miejsc podziału akapitu na wiersze. Jest jednak bezsilny,
gdy trzeba wyznaczyć najlepsze miejsca podziału na strony -- mimo że
poszukiwania można by było oprzeć o ten sam algorytm. To konsekwencja
założeń, że w dostępnej pamięci o pojemności wyrażanej w kilobajtach
trzymanie akapitu jest jeszcze rozsądne, ale pamięć w wielkościach
być może nawet megabajtowych, która by się przydała do przechowania
całego dokumentu (lub choćby rozdziału), to jakaś mrzonka.

> Chciałbym, żeby jeśli zostało mało miejsca na dole strony rozpocząć
> od nowej strony. Mam długą tabelę o nieznanej długości (longtable),
> po niej '\subsection'. Czyli jeśli tabela się skończy i jest powiedzmy
> mniej niż 1/3 wolnej strony to zaczyna od nowej strony.
>
> Próbowałem \vbox ale to powoduje, że strona się nie kończy i tabelka
> wyłazi poza stronę.

Narzędziem, które może być pomocne w rozwiązywaniu podobnych problemów
jest elastyczny klej (glue). Może mieć on postać na przykład taką:

\vglue 52 mm minus 30 mm plus 1 fill

Oznacza to, że dodane zostanie światło wielkości 52 mm, ale jeśli
trzeba, to skurczy sie ono o 30 mm lub wydłuży w nieskończoność.

Rozsądne może być przy tym zdefiniowanie "\subsection" w ten sposób,
by nagłówek nigdy nie mógł wystąpić sam, tylko żeby obowiązkowo coś
sie do niego od dołu przyklejało na stałe, choćby pierwszy akapit.

To wszystko rady ogólne, w takich przypadkach trzeba samemu kombinować.

Jarek

--
Idzie klej i po kolei napotkane rzeczy klei:
Stołki, szklanki, filiżanki, salaterki, wazy, dzbanki,
Talerzyki, flaszki, miski, garnki, wiadra i półmiski,
Nawet ławki, nawet szafki, nawet książki i zabawki.

Czarek Grądys

unread,
Feb 10, 2015, 8:28:06 AM2/10/15
to
W dniu 10.02.2015 o 13:18, Jarosław Sokołowski pisze:
Dzięki serdeczne, właśnie chodzi o to, żeby ten nagłówek nie był samotny
na samym dole strony. Jeśli na dole, to żeby chociaż kawałek następnej
tabelki pod nim był. Tu nie mam wielkich wymagań, bo to protokoły z
pomiarów elektrycznych, aby na oko wyglądało w miarę dobrze.
Jutro pokombinuję z tym.

--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 10, 2015, 9:31:18 AM2/10/15
to
Pan Czarek Grądys napisał:

> Dzięki serdeczne, właśnie chodzi o to, żeby ten nagłówek nie był samotny
> na samym dole strony. Jeśli na dole, to żeby chociaż kawałek następnej
> tabelki pod nim był. Tu nie mam wielkich wymagań, bo to protokoły z
> pomiarów elektrycznych, aby na oko wyglądało w miarę dobrze.
> Jutro pokombinuję z tym.

Wydaje się, że \vglue pomiędzy nagłówkiem a tabelą powinno problem
rozwiązać. W pewnym uproszczeniu jest tak, że światło można tworzyć
przez \vskip albo \vglue -- jedno dopuszcza złamanie strony, drugie
nie.

Jarek

--
Więcej światła!

Czarek Grądys

unread,
Feb 10, 2015, 9:54:25 AM2/10/15
to
W dniu 10.02.2015 o 15:30, Jarosław Sokołowski pisze:
Mam coś takiego:

% tu kończy się pierwsza tabelka
\hline
\end{longtable}
}


\vfill


\pagebreak[3]
\pagebreak[3] \subsection{Pomiar wyłączników różnicowo-prądowych.} %####
\vglue
\scriptsize{
\setlongtables
\begin{longtable}{|c|c|c|c|c|}

\caption[Feasible triples for a highly variable Grid]{Badanie
wyłączników różnicowo - prądowych} \label{grid_mlmmh} \\

\hline

%\multirow{2}{*}{\multicolumn{1}{c}{\textbf{LP}}}


Niestety, to co w '\subsection' jest uparcie na samym dole strony.
Problem jest, bo to będzie ponad 100 plików generowanych przez skrypt i
w każdym te tabelki będą innej długości. Chciałbym to jakoś rozwiązać.
Niby mogę wymusić złamanie strony, ale też głupio będzie jak pół strony
puste zostanie, niektóre z tabelek będą krótkie.
Właśnie było by dobre takie sklejenie jak piszesz, ale coś mi nie wychodzi.




--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 10, 2015, 10:13:26 AM2/10/15
to
Pan Czarek Grądys ma coś takiego:

> % tu kończy się pierwsza tabelka
> \hline
> \end{longtable}
> }
>
>
> \vfill
>
>
> \pagebreak[3]
> \pagebreak[3] \subsection{Pomiar wyłączników różnicowo-prądowych.} %####
> \vglue
> \scriptsize{
> \setlongtables
> \begin{longtable}{|c|c|c|c|c|}
>
> \caption[Feasible triples for a highly variable Grid]{Badanie
> wyłączników różnicowo - prądowych} \label{grid_mlmmh} \\
>
> \hline
>
> %\multirow{2}{*}{\multicolumn{1}{c}{\textbf{LP}}}
>
>
> Niestety, to co w '\subsection' jest uparcie na samym dole strony.
> Problem jest, bo to będzie ponad 100 plików generowanych przez skrypt i
> w każdym te tabelki będą innej długości. Chciałbym to jakoś rozwiązać.
> Niby mogę wymusić złamanie strony, ale też głupio będzie jak pół strony
> puste zostanie, niektóre z tabelek będą krótkie.
> Właśnie było by dobre takie sklejenie jak piszesz, ale coś mi nie wychodzi.

Po pierwsze, to "\vglue" wymaga parametru. Czyli na przykład "\vglue 0pt"
albo "\vglue 0pt plus 20pt". Po drugie, to gdzieś do listy pionowej musiał
się wraść jakiś "\vskip", na którym łamana jest strona. Zapewne definicja
"\subsection" zawiera jakiś "\vskip" na końcu.

Może (przynajmniej w ramach testów) zrobić coś takiego jak na przykład:

\leftline{\bf Pomiar wyłączników różnicowo-prądowych.}
\vglue 10 pt plus 6pt minus 2 pt
\scriptsize{
...

Jarek

--
Dookoła krążą sobie różne prądy,
Na te prądy różne róznych są poglądy.
My do prądu podchodzimy raczej stąd
By rachunek nie za duży był za prąd.

Czarek Grądys

unread,
Feb 11, 2015, 2:39:05 AM2/11/15
to
W dniu 10.02.2015 o 16:13, Jarosław Sokołowski pisze:

> Może (przynajmniej w ramach testów) zrobić coś takiego jak na przykład:
>
> \leftline{\bf Pomiar wyłączników różnicowo-prądowych.}
> \vglue 10 pt plus 6pt minus 2 pt
> \scriptsize{
> ...


Zrobiłem tak i jest to samo, napis jest na dole strony, a tabelka na
następnej stronie. A nie dało by się tak, że złamanie strony nastąpi
jeśli pozostało mało miejsca, np mniej niż 5 cm? To by rozwiązało
problem, może mniej elegancko, ale skutecznie.

Próbnie mam tak, niestety lipa:

\hline
\end{longtable}
}
\vfill
\leftline{\bf Pomiar wyłączników różnicowo-prądowych.}
\vglue 10 pt plus 6pt minus 2 pt
\scriptsize{
\setlongtables
\begin{longtable}{|c|c|c|c|c|}






--
Cezary Grądys
czar...@wa.onet.pl

Czarek Grądys

unread,
Feb 11, 2015, 7:35:31 AM2/11/15
to
W dniu 11.02.2015 o 08:39, Czarek Grądys pisze:

>
> Zrobiłem tak i jest to samo, napis jest na dole strony, a tabelka na
> następnej stronie. A nie dało by się tak, że złamanie strony nastąpi
> jeśli pozostało mało miejsca, np mniej niż 5 cm? To by rozwiązało
> problem, może mniej elegancko, ale skutecznie.
>
> Próbnie mam tak, niestety lipa:
>
> \hline
> \end{longtable}
> }
> \vfill
> \leftline{\bf Pomiar wyłączników różnicowo-prądowych.}
> \vglue 10 pt plus 6pt minus 2 pt
> \scriptsize{
> \setlongtables
> \begin{longtable}{|c|c|c|c|c|}
>
>
>
>


Już myślałem, że \needspace{.2\textheight} rozwiąże problem, ale
rozwiązuje połowicznie. Dla \subsection i 1 nagłówka jest ok, ale na
samym dole strony jest to co przed \endfoot, a na początku następnej
strony mam to co przed \endhead

Czyli żeby nie gmatwać powstało coś takiego:


| koniec talelki 1 |
________________________



% PUSTE miejsce, czyli OK !!!!


________________________
| Stopka tabelki 2 | % tego nie chcę
________________________

==================================================== % koniec strony

_________________________
| Nagłowek tabelki 2 | % tego też nie chcę
__________________________


2.2 Pomiar wyłączników różnicowo-prądowych. % To co w \subsection - OK

dalej jest OK.






--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 11, 2015, 7:45:01 AM2/11/15
to
Pan Czarek Grądys napisał:

>> Może (przynajmniej w ramach testów) zrobić coś takiego jak na przykład:
>>
>> \leftline{\bf Pomiar wyłączników różnicowo-prądowych.}
>> \vglue 10 pt plus 6pt minus 2 pt
>> \scriptsize{
>> ...
>
> Zrobiłem tak i jest to samo, napis jest na dole strony, a tabelka na
> następnej stronie. A nie dało by się tak, że złamanie strony nastąpi
> jeśli pozostało mało miejsca, np mniej niż 5 cm? To by rozwiązało
> problem, może mniej elegancko, ale skutecznie.

W takim razie muszę przenieść swoje podejrzenia z "subsection" na
"longtable". To tam siedzą jakieś pionowe skipy, które umożliwiają
podział na strony w każdym miejscu, więc i przed samą tabelką.

> \begin{longtable}{|c|c|c|c|c|}

Można przekopać się przez plik longtable.sty, wszystko przeanalizoać,
zmienić co trzeba, by odpowiadało aktualnym potrzebom. Można nawet
napisać na nowo, by dało się łatwo wprowadzić zakazy podziału strony
w pobliżu początku i końca tabelki. Ale tu widzę, że potrzebna jest
bardzo proste zestawienie z pięcioma stałymi kolumnami. Ja bym to
zrobił samodzielnie definiując \hbox określonej szerokości dla wiersza
danych (mam pokazać jak to zrobić?). Kilkulinijkowa definicja, a mamy
kontrolę nad wszystkim i możemy eksperymentować świadomie, a nie w ciemno.

Wtedy można w każdym miejscu dodać z automatu odpowiednią karę (penalty),
która posłuży kalkulowaniu najlepszego miejsca na podaiał strony. Można
nawet zrobić pewnien trik -- nie wyprowadzać osobno linii, tylko wyłączyć
justowanie, wpuszczać te szerokie boksy z wierszami jako jeden akapit,
a ponieważ w jednym wierszu strony nie zmieści się więcej niż jeden wiersz
danych, to wyjdzie zgrabna tabelka. A działać będą mechanizmy łamania
akapitów -- widowpenalty i clubpenalty odpowiedzialne za pozostawianie
wdów i sierot (samotnych wierszy na początku i końcu strony).

Jarek

--
Rum Helka, rum Helka, tyś gruba jak ta belka
tyś mocna jak ta szklanka, masz suknię pod kolanka

Czarek Grądys

unread,
Feb 11, 2015, 7:56:25 AM2/11/15
to
W dniu 11.02.2015 o 13:44, Jarosław Sokołowski pisze:

>
> W takim razie muszę przenieść swoje podejrzenia z "subsection" na
> "longtable". To tam siedzą jakieś pionowe skipy, które umożliwiają
> podział na strony w każdym miejscu, więc i przed samą tabelką.
>
>> \begin{longtable}{|c|c|c|c|c|}
>
> Można przekopać się przez plik longtable.sty, wszystko przeanalizoać,
> zmienić co trzeba, by odpowiadało aktualnym potrzebom. Można nawet
> napisać na nowo, by dało się łatwo wprowadzić zakazy podziału strony
> w pobliżu początku i końca tabelki. Ale tu widzę, że potrzebna jest
> bardzo proste zestawienie z pięcioma stałymi kolumnami. Ja bym to
> zrobił samodzielnie definiując \hbox określonej szerokości dla wiersza
> danych (mam pokazać jak to zrobić?). Kilkulinijkowa definicja, a mamy
> kontrolę nad wszystkim i możemy eksperymentować świadomie, a nie w ciemno.
>
> Wtedy można w każdym miejscu dodać z automatu odpowiednią karę (penalty),
> która posłuży kalkulowaniu najlepszego miejsca na podaiał strony. Można
> nawet zrobić pewnien trik -- nie wyprowadzać osobno linii, tylko wyłączyć
> justowanie, wpuszczać te szerokie boksy z wierszami jako jeden akapit,
> a ponieważ w jednym wierszu strony nie zmieści się więcej niż jeden wiersz
> danych, to wyjdzie zgrabna tabelka. A działać będą mechanizmy łamania
> akapitów -- widowpenalty i clubpenalty odpowiedzialne za pozostawianie
> wdów i sierot (samotnych wierszy na początku i końcu strony).
>
> Jarek
>


Zapewne problem leży w longtable, niestety ja nie jestem biegły w
LaTeXu, robię to dorywczo. Wydawało się, że longtable się sprawdzi, a tu
lipa. Ewentualnie podzielę stronę po każdej tabelce i potem pousuwam
podziały w plikach które tego nie wymagają. Ale to trochę przeglądania,
lepiej jakby automatycznie się dało.

--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 11, 2015, 8:30:10 AM2/11/15
to
Pan Czarek Grądys napisał:

> Zapewne problem leży w longtable, niestety ja nie jestem biegły w
> LaTeXu, robię to dorywczo. Wydawało się, że longtable się sprawdzi,
> a tu lipa. Ewentualnie podzielę stronę po każdej tabelce i potem
> pousuwam podziały w plikach które tego nie wymagają. Ale to trochę
> przeglądania, lepiej jakby automatycznie się dało.

W LaTeXu, to ja też biegły nie jestem. To w końcu jest zbiór nieraz
mocno wyrafinowanych makr, które różni ludzie napisali na własne
potrzeby. Trzeba przeczytać dokumentację (często wiele stron) i
zobaczyć czy się nam to nada. W TeXu, to już bardziej -- przez blisko
trzydzieści lat oswoiłem się z systemem, wiem jak sobie radzić i czego
się spodziewać.

Jak te tabele wyglądają? Gdzie są (mogą być, muszą być) kreski pionowe
i poziome? Jak wygląda cały dokument? A może nie będzie wiele roboty
gdyby systemowi produkującemu manuskrypt przydać trochę inteligencji?
Na tyle, by orientował się na której stronie i w którym jej miejscu
jesteśmy. Żeby mógł zdecydować, czy zaczynać nową tabelę, czy zrobić
"break".

Jeszcze jedna szaleńcza myśl przyszła mi do głowy. Mając prosty raport
złożony z kolejnych wierszy, w którym nieistotne jest formatowanie
długich akapitów, dysponując współczesnymi środkami postscriptowymi
w TeXu, takimi jak obracanie tekstu o 90 stopni, można postawić rzecz
na boku i potraktować boksy z wierszami jako elementy akapitu, a strony
jako wiersze składu (na jednej stronie mieści się jeden wiersz). Wtedy
cały dokument zostanie optymalnie połamany na strony, takim algorytmem,
jaki służy do podziału akapitu na wiersze. Czyli światła zostaną
rozłożone równomiernie w całym dokumencie,

--
Jarek

Czarek Grądys

unread,
Feb 12, 2015, 2:27:24 AM2/12/15
to
W dniu 11.02.2015 o 14:30, Jarosław Sokołowski pisze:
> Jak te tabele wyglądają? Gdzie są (mogą być, muszą być) kreski pionowe
> i poziome? Jak wygląda cały dokument? A może nie będzie wiele roboty
> gdyby systemowi produkującemu manuskrypt przydać trochę inteligencji?
> Na tyle, by orientował się na której stronie i w którym jej miejscu
> jesteśmy. Żeby mógł zdecydować, czy zaczynać nową tabelę, czy zrobić
> "break".


Dokument wygląda tak:

Jakieś daty, dla kogo pomiary, logo itp

\section{Oględziny.}
Stan zewnętrzny obudowy, napisów, zamocowanie rozdzielnicy, odstępy
izolacyjne, wykonanie złącz,
podłączenie przewodów ochronnych, zamocowanie aparatury i kabli bez
zastrzeżeń.
Sprawdzono i potwierdzono ciągłość przewodu PE.


\section{Badanie ochrony przeciwporażeniowej.}

\subsection{Pomiar .....} % to 3 razy, różne pomiary
\scriptsize{
\setlongtables
% tu tabelka, która może być dość długa, kreski poziome i pionowe potrzebne.




\section{Orzeczenie.}
Wyżej wymienione instalacje nadają się do eksploatacji.
\section{Pomiarów dokonano:}
\noindent Uniwersalny miernik parametrów instalacji elektrycznej.\\
Typ: EUROTEST 615557\\
Nr fabryczny: 11065263
% Jeszcze nie dorobiona tabelka na podpisy robiących
\end{document}



Myślałem nad tym, żeby sprawdzić ile wchodzi przeciętnie wierszy na
stronę w tabeli i w skrypcie liczyć. Wtedy skrypt mógłby zadecydować czy
jest za mało miejsca i złamać stronę. Ale to też trochę zachodu z tym jest.

Znalazłem coś takiego jak pakiet needspace.
\needspace{.2\textheight} %nie działa dobrze, kaszani się tabelka.

Natomiast \pagebreak działa OK, dlatego myślałem, czy nie da się zrobić,
żeby warunkowo, żeby się wykonywał, jeśli mało jest miejsca.

Albo po prostu wstawię go, a ręcznie w tych dokumentach które będą tego
wymagać usunę. Ale to przeglądanie 100 plików, lepiej jakby udało się
rozwiązać automatycznie.
A ostatecznie to estetyki wielkiej nie wymaga, może dam sobie spokój,
niech ten \subsection będzie na dole strony. Na razie jednak walczę.







--
Cezary Grądys
czar...@wa.onet.pl

Czarek Grądys

unread,
Feb 12, 2015, 3:41:42 AM2/12/15
to
W dniu 10.02.2015 o 11:49, Czarek Grądys pisze:
Chyba sukces, jeszcze potestuję, ale na razie wygląda OK.
Mam tak:


%tabelka longtable
\hline
\end{longtable}
}
\vspace{2cm}
\Needspace{17\baselineskip}
\subsection{Pomiar wyłączników różnicowo-prądowych.}
\scriptsize{
\setlongtables
\begin{longtable}{|c|c|c|c|c|}
....
....
....


Wygląda, że przenosi jak mało miejsca i tabelka się nie kaszani.
Zauważyłem, że wstawia pusty nagłówek tabelki jeśli nie ma dalszych
linii na początku strony, ale to małe piwo. Z tym może powalczę jak czas
będzie.






--
Cezary Grądys
czar...@wa.onet.pl

Jarosław Sokołowski

unread,
Feb 12, 2015, 8:42:20 AM2/12/15
to
Pan Czarek Grądys napisał:

>> Próbowałem \vbox ale to powoduje, że strona się nie kończy i tabelka
>> wyłazi poza stronę.
>
> Chyba sukces, jeszcze potestuję, ale na razie wygląda OK.
> Mam tak:
>
> %tabelka longtable
> \hline
> \end{longtable}
> }
> \vspace{2cm}
> \Needspace{17\baselineskip}
> \subsection{Pomiar wyłączników różnicowo-prądowych.}
> \scriptsize{
> \setlongtables
> \begin{longtable}{|c|c|c|c|c|}
> ....
> ....
> ....
>
> Wygląda, że przenosi jak mało miejsca i tabelka się nie kaszani.

No to świetnie! Nie wiem czy to pomoże i czy pomagać jeszcze musi,
ale na pewno nie zaszkodzi -- ja bym zamienił LaTeXowe "\vspace" na
TeXowe "\vskip" i to w postaci elastycznej, czyli "\vskip 2cm plus
1 fill", żeby bezkarnie dało się tam rozciągnąć. Lamport tłumacząc
Knutha na swoje w ogóle pominął wszelkie elastyczności -- trudno
podać jedną dominująca przyczynę, dlaczego tak zrobił.

> Zauważyłem, że wstawia pusty nagłówek tabelki jeśli nie ma dalszych
> linii na początku strony, ale to małe piwo. Z tym może powalczę jak
> czas będzie.

A czy powtarzanie na każdej stronie nagłówków wielostronicowych tabel
jest warunkiem koniecznym? Jest to zadaje się jedną z rzeczy, którą
stara się robić pakiet longtable. A wychodzi jak wychodzi, bo nie
jest to takie trywialne -- znowu z powodów zaszłości TeXowych.

Gdyby nie było, to można tabele o stałych szerokościach kolumn
implementować trywialna boksową metodą, o której już wspomniałem.
Szkic realizacji mozna przyjąc mniej więcej taki:

\def\cc#1#2{\hbox to #1{\hss#2\hss}}
\def\ccf#1{\hss#1\hss}
\def\vv{\vrule depth 4pt height 12pt}

\def\wiersz#1#2#3#4#5{\hrule
\hbox to \hsize
{\vv\cc{3cm}{#1}\vv\cc{3cm}{#2}\vv\cc{4cm}{#3}\vv\cc{3cm}{#4}\vv\ccf{#5}\vv}
\hrule\vskip-0.4pt}

\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}
\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}
\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}
\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}
\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}
\wiersz{AAA}{BBBB}{CCCCC}{DDDDDD}{EEEEEEEE}

Jarek

--
Wszystko my mu dawali
Newet i to cjankali
Lecz nyc mu nie pomogło
Bo pomóc nyc -- nie mogło
0 new messages