Bagaimana cara memformat node / struct dalam tikz?

Sep 11 2020

Saya telah membuat kotak (atau matriks) Eisenhower berikut ini terinspirasi oleh jawaban fantastis ini :

Saya ingin milik saya jauh lebih hemat ruang: ukuran teks yang lebih kecil / kotak centang, batas lebih tipis, tidak ada spasi / margin / selokan di antara kotak, tidak ada garis horizontal dalam kotak, dll.
Teks di sebelah kiri adalah perkiraan yang baik dari maks. ukuran teks item daftar periksa harus.

Tetapi setelah mengutak-atik ekstensif, saya masih tidak dapat mengubah properti berikut:

  1. Perbatasan
    • Buat garis tepi menjadi sangat tipis (1 piksel sudah cukup)
  2. Periksa item / kotak
    • Hapus garis horizontal
    • Pastikan \Boxsetiap item checklist lebih kecil dan / atau skala dengan teks
    • Buat barang lebih rapat / lebih dekat secara vertikal?
  3. label teks
    • Rata tengah di tepi kiri / atas setiap kotak

Di bawah ini adalah dokumen saya:

main.tex

\documentclass[english]{book}

\usepackage{amssymb, tikz}
\usetikzlibrary{shapes.multipart, positioning, fit, backgrounds}

...

% \eisenbox: for making each box of an Eisenhower square
\newcommand{\eisenbox}[6][] {
    \node [rectangle split,rectangle split parts={#6}, fill=white,
    text width=5.25cm,align=left,text=#2,draw,sharp corners,draw=#2,
    #1]
    (multi-#3)
    {\strut$\Box$\nodepart{two}\strut$\Box$\nodepart{three}\strut$\Box$\nodepart{four}\strut$\Box$
    \nodepart{five}\strut$\Box$\nodepart{six}\strut$\Box$\nodepart{seven}\strut$\Box$
    \nodepart{eight}\strut$\Box$\nodepart{nine}\strut$\Box$\nodepart{ten}\strut$\Box$};
    \node[left=1pt of multi-#3.south west,anchor=south west,rotate=90,text=black] 
    (label-#3) {#5};
    
    \begin{scope}[on background layer]
        \node[fit=(multi-#3),fill=#2,sharp corners,
        label={[text=#2,anchor=south west,font=\bfseries]above left:#4}] (fit-#3){};
    \end{scope}
}

% \eisensquare: creates a fancy Eisenhower square
\newcommand{\eisensquare}[1] {
    \eisenbox{black}{tl}{\footnotesize Urgent}{\footnotesize Important}{#1}
    \eisenbox[right=0.2cm of multi-tl]{black}{tr}{\footnotesize Not Urgent}{}{#1}
    \eisenbox[below=0.2cm of multi-tl]{black}{bl}{}{\footnotesize Not Important}{#1}
    \eisenbox[right=0.2cm of multi-bl]{black}{br}{}{}{#1}
}

...

\begin{document}
    \frontmatter

    \maketitle
    ...

    \mainmatter

    ...
    \subfile{./folder/subfile.tex}

    \backmatter

\end{document}

subfile.tex

\documentclass[../main.tex]{subfiles}

    \begin{document}

    ...
    
    \paragraph{Foo}\mbox{}\\    
        \begin{tikzpicture}[font=\sffamily]
            \eisensquare{7}
        \end{tikzpicture}
    
    ...

\end{document}

Tidak yakin apa yang saya lakukan salah. tikzabaikan / melempar kesalahan di mana pun saya menempatkan width, line width, dll di mana saja di \node [options]dalam \eisenbox.

Saya benar-benar baru di pgf/ tikz, jadi semua wawasan akan sangat dihargai.

EDIT 1 ------------

Sesuai jawaban teladan gernot, saya baru saja akan mendapatkannya. Yang tersisa hanyalah modifikasi untuk jumlah item variabel per 'kuadran'. Saya biasanya tidak akan pernah begitu khusus, jika bukan karena fakta bahwa saya akan menggunakan ini setiap hari untuk waktu yang sangat lama.

Bagaimana cara membuat baris kosong / kosong ketika baris tersisa> jumlah item?

main.tex

\newcommand\eisenlabel[1]{{\footnotesize\sffamily#1}}

% arguments: 1st is total # lines, 2nd is # items
\newcommand{\eisenbox}[2]{\fbox{%
        \begin{tabular}{l}
            \multido{}{#1}{%
                \makebox[0.44\textwidth][l]{$\square$} %adding \\ here makes errors, but I believe its absence is FUBARing the table
            }
        \end{tabular}%
}}

% first argument: max lines, then items per quadrant starting with urgent+important
% could do this without 1st arg by determining largest value
% but not familiar enough with this so we'll just supply it manually (for now)
\newcommand{\eisensquare}[5] {%
    \fboxrule=0.1ex% <<< adjust line width
    \begin{tabular}{@{}r@{\hspace{0.3em}}c@{\hspace{-\fboxrule}}c@{}} % <<< adjust distance between rotated labels and box
        & \eisenlabel{urgent} & \eisenlabel{not urgent} \\
        \turnbox{90}{\makebox[0pt]{\eisenlabel{important}}}
        & \eisenbox{#1}{#2} & \eisenbox{#1}{#3} \\[-\fboxrule] 
        \turnbox{90}{\makebox[0pt]{\eisenlabel{not important}}}
        & \eisenbox{#1}{#4} & \eisenbox{#1}{#5}
    \end{tabular}%
}

subfile.tex

\(\eisensquare{5}{3}{4}{5}{3}\)

Jawaban

1 gernot Sep 15 2020 at 03:21

Berikut adalah solusi yang fleksibel. Karena \multidotidak bekerja dengan baik di a tabular, saya menggunakan perintah yang lebih mendasar. Perintah tingkat atas adalah

\eisensquare{height of single box}{width of single box}{top left}{top right}{bottom left}{bottom right}

heightdan widthdapat berupa dimensi absolut atau kelipatan panjang seperti \baselineskip(tinggi garis) atau \textwidth.

\documentclass{article}
\usepackage{amssymb,rotating,multido}
% \eisenlabel{width}{label}
\newcommand\eisenlabel[2]{\makebox[#1]{\footnotesize\sffamily#2}}
% \veisenlabel{height}{label}
\newcommand\veisenlabel[2]{\turnbox{90}{\eisenlabel{#1}{#2}}\ }
% \eisenbox{height}{width}{number of items}
\newcommand\eisenbox[3]{\fbox{%
  \vbox to #1{%
    \multido{}{#3}{\hbox to #2{$\square$\hfill}}%
    \vfill  
  }%
}}
% \eisensquare{height of single box}{width of single box}{top left}{top right}{bottom left}{bottom right}
\newcommand\eisensquare[6]{{%
  \fboxrule=0.1ex%
  \vbox{%
    \hbox{\ \eisenlabel{#2}{urgent}\ \eisenlabel{#2}{not urgent}}%
    \hbox{\veisenlabel{#1}{important}\eisenbox{#1}{#2}{#3}\hspace{-\fboxrule}\eisenbox{#1}{#2}{#4}}%
    \nointerlineskip
    \vspace{-\fboxrule}%
    \hbox{\veisenlabel{#1}{not important}\eisenbox{#1}{#2}{#5}\hspace{-\fboxrule}\eisenbox{#1}{#2}{#6}}%
}}}
\begin{document}
\noindent
\eisensquare{5\baselineskip}{0.4\textwidth}{3}{4}{5}{3}

\noindent
\eisensquare{2cm}{5cm}{3}{4}{5}{3}
\end{document}
1 gernot Sep 11 2020 at 01:21

Tikz adalah paket yang luar biasa, tetapi untuk desain yang sederhana, saya sarankan untuk menggunakan tabel. Mungkin lebih jelas di mana harus memodifikasi tampilan.

Saya menyarankan untuk menggunakan ematau exsebagai unit panjang, karena mereka berubah dengan ukuran font. Dalam kode, saya telah menandai tempat-tempat untuk menyesuaikan lebar kotak, lebar garis, dan jarak label vertikal.

\documentclass{article}
\usepackage{amssymb,rotating}
\newcommand\eisenlabel[1]{{\footnotesize\sffamily#1}}
\newcommand\eisenline{\makebox[0.44\textwidth][l]{$\square$}}% <<< adjust width of boxes
\newcommand\eisenbox{\fbox{%
  \begin{tabular}{l}
    \eisenline\\
    \eisenline\\
    \eisenline\\
    \eisenline\\
    \eisenline\\
    \eisenline\\
    \eisenline
  \end{tabular}%
}}
\newcommand\eisensquare{{%
  \fboxrule=0.1ex% <<< adjust line width
  \begin{tabular}{@{}r@{\hspace{0.3em}}c@{\hspace{-\fboxrule}}c@{}} % <<< adjust distance between rotated labels and box
    & \eisenlabel{urgent} & \eisenlabel{not urgent} \\
  \turnbox{90}{\makebox[0pt]{\eisenlabel{important}}}
    & \eisenbox & \eisenbox \\[-\fboxrule] 
  \turnbox{90}{\makebox[0pt]{\eisenlabel{not important}}}
    & \eisenbox & \eisenbox
  \end{tabular}%
}}
\begin{document}
\noindent
\eisensquare
\end{document}