আমি কি সূত্রের উপর নির্ভর করে একটি org- মোড টেবিলের ঘরগুলি আলাদাভাবে ফর্ম্যাট করতে পারি?


17

আমার প্রতিটি কক্ষের সংখ্যা সহ একটি org- মোড টেবিলের একটি কলাম রয়েছে। সংখ্যাটি 1 এর নিচে বা 2 এর উপরে হলে আমি ঘরের ব্যাকগ্রাউন্ডের রঙটি লাল করতে চাই।

আমি এটা কিভাবে করবো?


3
দুর্দান্ত প্রশ্ন! উভয় org-table-edit-formulasওরফে C-c 'এবং org-table-toggle-coordinate-overlaysওরফে C-c }প্রদান সংকেত সনাক্ত করুন কিভাবে বৈশিষ্ট্য হাইলাইট এই ধরনের বাস্তবায়ন করেন। সম্ভবত কোনও এলিস্প গুরু কিছু অতিরিক্ত ইঙ্গিত বা উদাহরণ সরবরাহ করবেন।
মেলিওরাটাস

উত্তর:


5

কিছু এলিস্পের সাথে কাজ করার জন্য আমি পুরো টেবিল বিন্যাস পেয়েছি:

কোষের বিষয়বস্তুর জন্য একটি সূত্র মূল্যায়ন করা হয় এবং গ্রেডিয়েন্ট ব্যবহার করে কোনও রঙে রূপান্তরিত হয়।

কোড সহ org ফাইল:

#+name: item-prices
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Item                  | Weight | Label Price | Ratio | CS-F | <-LR |   <-WR | CS-N | Si-N | Si-2 | St-N | St-F |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Охотничье ружьё       |    3.3 |         400 |   121 |   40 |   10 |  11.82 |      |   40 |   40 |   50 |   60 |
| «Гадюка-5»            |   2.88 |        3000 |  1042 |  300 |   10 | 103.82 |      |  300 |  300 |  375 |  450 |
| Обрез                 |   1.90 |         200 |   105 |   20 |   10 |  10.00 |      |   20 |   20 |   25 |   30 |
| ПМм                   |   0.73 |         300 |   411 |   30 |   10 |  39.73 |      |   30 |   30 |   37 |   45 |
| АКМ-74/2 *            |   3.07 |        4000 |  1303 |  637 |   16 | 207.49 |      |  318 |  318 |  398 |  478 |
| АКМ-74/2У             |   2.71 |        2100 |   775 |  420 |   20 | 154.61 |      |  210 |  210 |  262 |  315 |
| ПБ-1с                 |   0.97 |         400 |   412 |  120 |   30 | 122.68 |  100 |   40 |   40 |   50 |   60 |
| «Чeйзер-13»           |   3.00 |        1250 |   417 |      |      |        |      |  125 |      |      |      |
| «Чeйзер-13» *         |        |        1250 |   417 |  200 |   16 |  66.33 |      |  100 |  100 |  125 |  149 |
| ХПСС-1м               |   0.94 |         600 |   682 |      |      |        |      |   60 |      |      |      |
| ХПСС-1м *             |   0.88 |         600 |   682 |   92 |   15 | 104.55 |      |   46 |   46 |   57 |   69 |
| «Фора-12»             |   0.83 |         600 |   723 |  120 |   20 | 143.37 |      |   60 |   60 |   74 |   90 |
| «Кора-919»            |   1.10 |        1500 |       |      |      |        |      |  150 |  150 |      |  225 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Прицел ПСО-1          |   0.20 |        1000 |  5000 |  100 |   10 | 500.00 |      |  150 |  150 |  150 |  200 |
| Детектор «Отклик»     |   0.00 |         500 |   inf |   50 |   10 |  50.00 |      |  100 |  100 |  175 |  250 |
| Детектор «Медведь»    |   0.00 |        1000 |   inf |  100 |   10 | 100.00 |      |      |      |      |  500 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Кожаная куртка        |   3.00 |         500 |   167 |  250 |   50 |  83.33 |      |    - |    - |  200 |      |
| Бронежилет ЧН-1       |   4.00 |        5000 |  1250 | 2500 |   50 | 625.00 |      |    - |    - |      |      |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Аптечка               |   0.10 |         300 |  3000 |   30 |   10 | 300.00 |   16 |   45 |   45 |  105 |  150 |
| Бинт                  |   0.05 |         200 |  4000 |   20 |   10 | 400.00 |   11 |   30 |      |   70 |  100 |
| Противорад. п.        |   0.05 |         300 |  6000 |   30 |   10 | 600.00 |   16 |   45 |      |  105 |  150 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Водка «Казаки»        |   0.60 |         100 |   167 |  100 |  100 | 166.67 |  100 |    - |    - |    - |    - |
| «Завтрак туриста»     |   0.30 |         100 |   333 |  100 |  100 | 333.33 |      |    - |    - |    - |    - |
| Колбаса «Диетическая» |   0.50 |          50 |   100 |   50 |  100 | 100.00 |      |    - |    - |    - |    - |
| Хлеб                  |   0.30 |          20 |    67 |   20 |  100 |  66.67 |      |    - |    - |    - |    - |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Патроны 9x18 мм       |   0.20 |          50 |   250 |    5 |   10 |  25.00 |    3 |    7 |    7 |    5 |    5 |
| Патроны 9x19 мм РВР   |   0.24 |         100 |   417 |   20 |   20 |  83.33 |   15 |      |      |      |      |
| Патроны 9x19 мм ЦМО   |   0.24 |         100 |   417 |      |    0 |   0.00 |      |   15 |   15 |   15 |   20 |
| Патроны 12x70 дробь   |   0.45 |          10 |    22 |    1 |   10 |   2.22 |    0 |    1 |      |    1 |    1 |
| Патроны 12x76 жекан   |   0.50 |          20 |    40 |    4 |   20 |   8.00 |    3 |    1 |      |    3 |    4 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Граната РГД-5         |   0.30 |         350 |       |      |      |        |      |   52 |   52 |   70 |   70 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| «Медуза»              |    0.5 |        4000 |  8000 |      |    0 |   0.00 |      | 2800 | 3600 | 2500 | 2800 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
#+TBLFM: $4='(/ (string-to-number $3) (string-to-number $2));%1.f
#+TBLFM: $6='(/ (string-to-number $5) 0.01 (string-to-number $3));%1.f
#+TBLFM: $7=$5/$2;%1.2f

#+begin_src emacs-lisp :var table=item-prices
  (defun cs/itpl (low high r rlow rhigh)
    "Return the point between LOW and HIGH that corresponds to where R is between RLOW and RHIGH."
    (+ low (/ (* (- high low) (- r rlow)) (- rhigh rlow))))

  (defun cs/gradient (gradient p)
    (if (< p (caar gradient))
        (cdar gradient)
      (while (and (cdr gradient) (> p (caadr gradient)))
        (setq gradient (cdr gradient)))
      (if (null (cdr gradient))
          (cdar gradient)
        (list
         (cs/itpl (nth 1 (car gradient)) (nth 1 (cadr gradient)) p (caar gradient) (caadr gradient))
         (cs/itpl (nth 2 (car gradient)) (nth 2 (cadr gradient)) p (caar gradient) (caadr gradient))
         (cs/itpl (nth 3 (car gradient)) (nth 3 (cadr gradient)) p (caar gradient) (caadr gradient))))))

  (defun cs/scs-table-color ()
    (when (boundp 'cs/cell-color-overlays)
      (mapc #'delete-overlay cs/cell-color-overlays))
    (setq-local cs/cell-color-overlays nil)

    (save-excursion
      (org-table-map-tables
       (lambda ()
         (let* ((table (cl-remove-if-not #'listp (org-table-to-lisp))) ; remove 'hline
                (heading (car table))
                (element (org-element-at-point)))
           (while (and element (not (eq (car element) 'table)))
             (setq element (plist-get (cadr element) :parent)))
           (cond
            ((equal (plist-get (cadr element) :name) "item-prices")

             (org-table-analyze)
             (cl-loop for row being the elements of (cdr table) using (index row-index)
                      do (cl-loop for col being the elements of row using (index col-index)
                                  if (and
                                      (string-match "^..-.$" (nth col-index heading))
                                      (not (zerop (length col)))
                                      (not (equal "0" col)))
                                  do (progn
                                       (org-table-goto-field (format "@%d$%d" (+ 2 row-index) (1+ col-index)))
                                       (forward-char)
                                       (let* ((base-price (string-to-number (nth 2 row)))
                                              (vendor-price (string-to-number col))
                                              (ratio (/ vendor-price 1.0 base-price))
                                              (gradient '((0.10 #x40 #x00 #x00)
                                                          (0.20 #xC0 #x00 #x00)
                                                          (0.50 #x00 #x80 #x00)
                                                          (1.00 #x00 #xFF #x80)))
                                              (color (cs/gradient gradient ratio))
                                              (overlay (make-overlay
                                                        (progn (org-table-beginning-of-field 1) (backward-char) (point))
                                                        (progn (org-table-end-of-field 1) (forward-char) (point))))
                                              (bg (apply #'message "#%02x%02x%02x" color))
                                              (fg (if (< (apply #'+ color) 383) "#ffffff" "#000000"))
                                              (face (list
                                                     :background bg
                                                     :foreground fg)))
                                         (overlay-put overlay 'face face)
                                         (push overlay cs/cell-color-overlays)))))))))
       t)))

  (add-hook 'org-ctrl-c-ctrl-c-hook 'cs/scs-table-color nil t)
  nil
#+end_src

ওটা চমৎকার ছিল! আমি কীভাবে এটি সমস্ত সংযুক্ত আছে তার আরও কিছু গভীরভাবে বর্ণনা পড়তে চাই, এমনকি যদি এটি "যদি আপনি এক্স করেন তখন এই কোডটি চলে, এটি ওয়াই এবং জেডকে ইনপুট হিসাবে গ্রহণ করে এবং টেবিলে এটিই ঘটে" :)
ট্র্যাভোক

ধন্যবাদ। এটি আপনার দুটি জবাবের সংমিশ্রণ। কিছুটা বাড়াবাড়ি আছে কারণ এটি উভয়ই org-babel থেকে টেবিলের তথ্য গ্রহণ করে এবং সারণির নাম ঘোষণার জন্য অনুসন্ধান করে (যাতে এটি ওভারলেগুলি যুক্ত করতে পারে ইত্যাদি)। সেখান থেকে, এটি প্রাপ্ত সারণী ডেটা থেকে org- টেবিল ঘর স্থানাঙ্কগুলিতে সারি এবং কলাম নম্বরগুলি মানচিত্র করে। cs/itplসরল রৈখিক সংক্ষিপ্তকরণ করে এবং cs/gradientডেটা পয়েন্ট এবং রঙ স্টপগুলির একটি তালিকা ব্যবহার করে একটি রঙকে বিভক্ত করতে এটি ব্যবহার করে। সেখান থেকে, এটি আপনার উত্তর হিসাবে কেবল একটি ওভারলে যুক্ত করে। উদাহরণটি কিছুটা তুচ্ছ নয় কারণ এটি সারণীর অন্য কোথাও থেকে ডেটা নিয়ে পরামর্শ করে।
ভ্লাদিমির পানতেলিভ

একটি নতুন সংস্করণ সহ কোডটি আপডেট করেছে যা নাম / ডেটা রিডানডেন্সি সংশোধন করে, পুরানো ওভারলেগুলি সাফ করে, এবং নিজেকে একটি org-ctrl-c-ctrl-c-hook হিসাবে নিবন্ধিত করে যাতে আপনাকে চালানোর জন্য কোড ব্লকে বিন্দু রাখতে হবে না এটা। এটি ডকুমেন্টের সৌজন্যে সমস্ত সারণী আপডেট করতে পারে org-table-map-tables
ভ্লাদিমির পানতেলিভ

দারুণ. আমি এখানে আসেন এবং বামদের সাথে অপরিচিত হতে পারেন এমন লোকদের জন্য আরও কিছু মন্তব্য পছন্দ করব তবে এটি আশ্চর্যজনক, আপনাকে ধন্যবাদ!
ট্র্যাভোক

@ ভ্লাদিমিরপান্তলেভ আপনি কি জানেন যে আমি যদি এটি আমার কনফিগারেশনে যুক্ত করতে পারি এবং এটি কোনও "ইনবিল্ট" ফাংশন বানাতে পারি তবে আমি ইজিলি কোনও টেবিলে প্রয়োগ করতে পারি?
টেকোসর

4

একটি ওভারলে ব্যবহার করা হচ্ছে আমি কীভাবে এটি করতে চাই। আমি org-ctrl-c-ctrl-c-hook এ প্রবেশ করতে পারি। এর অর্থ আমি চেকটি চালানোর জন্য সিসি সিসি টিপতে পারি।

আমার সঠিকভাবে যাচাই করা দরকার যে আমি কোনও টেবিলের ভিতরে আছি এবং এটি সমস্ত কোষের জন্য চালাচ্ছি।

তারপরে আমি ওভারলেগুলি পুনরায় করতে বা কমপক্ষে সেগুলি সাফ করার জন্য আমার সম্ভবত প্রান্তিককরণ ফাংশনটিতে .োকা দরকার।

আমি যখন সিসি সিসি টিপব তখন মানটি 1 এর চেয়ে কম বা 2 এর চেয়ে বেশি হলে এই কোডটি ঘরের সেলটির ব্যাকগ্রাউন্ডকে লাল করে তুলবে ... তবে এটি এখনও বাগিচা এবং সেগুলির কোনও একটি না করলে ওভারলেগুলি সাফ করে দেবে ' টি নিয়মের সাথে মেলে।

(defun staggering ()
  (save-excursion
    (let* ((ot-field-beginning (progn (org-table-beginning-of-field 1) (point)))
           (ot-field-end (progn (org-table-end-of-field 1) (point)))
           (cell-text (buffer-substring ot-field-beginning ot-field-end)))
      (if (or (< (string-to-number cell-text) 1)
              (> (string-to-number cell-text) 2))
          (overlay-put (make-overlay
                        (progn (org-table-beginning-of-field 1) (point))
                        (progn (org-table-end-of-field 1) (point)))
                       'face '(:background "#FF0000"))))))
(add-hook 'org-ctrl-c-ctrl-c-hook 'staggering)

2

এটি এখনও কোনও উত্তর নয় তবে আমি এখানে আবিষ্কারিত জিনিসগুলির উপর নজর রাখতে চাই, কারণ তারা অন্য কাউকে ধারণা দিতে পারে।

শর্তাধীনভাবে নিজের ঘরের মানটি সংশোধন করা সম্ভব :

আমরা এলিজপে একটি ফর্ম্যাটিং ফাংশন তৈরি করতে পারি এবং তারপরে সূত্র লাইন থেকে এটি কল করতে পারি:

#+BEGIN_SRC emacs-lisp :results silent
(defun danger (cell)
  (if (or (< (string-to-number cell) 1)
          (> (string-to-number cell) 2))
        (concat (int-to-string (string-to-number cell)) "!")
        cell))
#+END_SRC

এবং এটি এর মতো ব্যবহার করা যেতে পারে:

| String | Num | 
|--------+-----| 
| Foo    |   2 | 
| Bar    |   1 | 
| Baz    |  3! | 
|--------+-----|
#+TBLFM: $2='(danger @0$0)

আমার মনে হয় আমি যা চাই তা ওভারলে তৈরির প্রয়োজন হতে পারে।


2

ইমাকস ফাংশনটি সরবরাহ করে hi-lock-face-buffer M-s h rযা আপনার টাইপ করার সাথে সাথে বাফারে একটি নিয়মিত অভিব্যক্তি হাইলাইট করে।

আমাদের যা দরকার তা হ'ল একটি নিয়মিত প্রকাশ যা কোনও সংখ্যার সাথে মেলে যা 1 বা 2 নয় এবং এটি একটি টেবিলের ঘরের মধ্যে রয়েছে। এটা চেষ্টা কর:

| *\(-[0-9]+\|[03-9]\|[0-9][0-9]+\) *|

(আপনি M-nএবং এর সাথে পূর্ববর্তী এক্সপ্রেশনগুলি স্মরণ করতে পারেন M-p))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.