কিভাবে ইমাকগুলিতে নিট ওয়ার্কফ্লো সেটআপ করবেন?


18

আর স্টুডিও নিটরের সাথে ল্যাটেক্স + আর উত্স থেকে পিডিএফ ফাইল তৈরির জন্য এক-বোতামের উপায় সরবরাহ করে। প্রজননযোগ্য গবেষণা করার জন্য এটি দুর্দান্ত দেখাচ্ছে looks এবং আমি এর জন্য আমার ইমাসগুলি কনফিগার করার চেষ্টা করছি:

  • বাম বাফারে লাইটেক্স + আর নিটার উপায়ে কোড;
  • ডান বাফার পিডিএফ আউটপুট পূর্বরূপ;
  • সংকলনের জন্য একটি কী সমন্বয়।

যদি এটি সম্ভব হয়: দয়া করে এটি কীভাবে সেটআপ করব?

(ইএসএস ঠিকঠাক কাজ করে, তবে কীভাবে নাইটার-ওয়ে সেটআপ করতে হয় এবং সংকলনের জন্য ওয়ান-বোতামটি কীভাবে জানি না))


আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে তবে আমার কাছে বর্তমানের কী বাইন্ডিং rmarkdown::render(মাধ্যমে shell-command) চালিত একটি সংক্ষিপ্ত এলিস্প ফাংশন রয়েছে buffer-file-nameযা অন্য উইন্ডোতে পিডিএফ আপডেট করবে।
daroczig

1
@दरোকজিগ ল্যাটেক্সের জন্য কাজ করবে, বা কেবল মার্কডাউন করবে?
টাইলার 21

@दरোকজিগ: আমার উত্তরে আমি সম্ভবত আরএনডাব্লু ফাইলগুলির জন্য এটি করার চেষ্টা করেছি (ল্যাটেক্স + আর)। আরএমডি ফাইলগুলি সম্পর্কিত (আরএমডি + আর), যা সহজ, দয়া করে একটি পৃথক পোস্ট শুরু করুন।
অ্যান্টোনিও

1
আমি সঠিক সেট আপ করতে পারিনি। পলিমোড-বোনা দিয়ে আমাকে প্রথমে বুনতে হবে। তারপরে .tex-file তৈরি করতে রফতানিকারী এবং সবকিছু নির্বাচন করুন। সেখান থেকে আমাকে লেটেক্স চালাতে হবে। আমি উপরের স্ক্রিপ্টটি মানিয়ে নেওয়ার চেষ্টা করেছি, তবে আমার এলিস্পটি এখনও সেখানে নেই। আমি যা চাই তা .Rnw-file বোনা, পিডিএফ (পিডিএফলেটেক্স) তৈরি এবং এটি দেখতে। আমি আমার সিস্টেমটি সেট আপ করেছি, যে আমি যদি লেটেক্স ফাইলে "সিসি Ca" (টেক্সট-কমান্ড-রান-অল) টাইপ করি, পিডিএফটি নির্মিত এবং দেখা হয়, তবে আমি আমার_কনিটর () থেকে টেক্সট ফাইলে সেই ফাংশনটি কল করতে পারি না) । সাহায্য প্রশংসা করা হবে। (my_knitr () defun ("আর-পলি মোডে নিট চালান এবং পিডিএফ তৈরি এবং দেখুন" (আন্তঃক্রিটি
ক্রিসেলাক

@ ক্রিসেলাক দেখে মনে হচ্ছে যে নীচে আমার উত্তরে বর্ণিত বৈশিষ্ট্যগুলি ESS থেকে সরানো হয়েছে। তাদের ব্যবহার করা নতুন পদ্ধতির প্রতিফলনের জন্য আমাকে এটি আপডেট করতে হবে
টাইলার

উত্তর:


12

হালনাগাদ

ESS 19.04 হিসাবে, ess-nowebএবং ess-swvগ্রন্থাগারগুলি অপ্রচলিত:

  • শিক্ষিত ডেটা বিশ্লেষণের জন্য গ্রন্থাগারগুলি অপ্রচলিত এবং ডিফল্টরূপে লোড হয় না। এর মধ্যে রয়েছে 'এসএস-নয়েব', 'এসএস-সোভ', এবং 'আরএনডব্লু-মোড' এর মতো সম্পর্কিত কার্যকারিতা। ব্যবহারকারীদের এই মোডগুলির সাথে সম্পর্কিত বিভিন্ন প্যাকেজগুলির মধ্যে একটিতে স্যুইচ করতে উত্সাহ দেওয়া হচ্ছে। উদাহরণস্বরূপ, পলিমোড https://github.com/polymode/poly-R/ , https://polymode.github.io/ , বা সম্পাদনা-পরোক্ষ https://jblevins.org/projects/markdown- সহ মার্কডাউন -মোড মোড

ফলস্বরূপ, আমার মূল উত্তর (নীচে) আর প্রযোজ্য নয়। এই লাইব্রেরিগুলি সরবরাহ করতে ব্যবহৃত বৈশিষ্ট্যগুলি এখন পলিমড দ্বারা সরবরাহ করা হয় এবং কনফিগারেশনটি সহজ। ন্যূনতম সমর্থন পেতে, আপনার যা দরকার তা হ'ল ess, polymodeএবং poly-Rপ্যাকেজগুলি ইনস্টল করা (মেলপা থেকে, বা উত্স থেকে যদি আপনি এভাবে রোল করেন)।

এটাই! এখন আপনি যদি কোনও Rnwফাইল খোলেন , আপনার PM-Rnwমডেলিনে পতাকাটি দেখতে হবে Polymodeএবং উপরে একটি মেনু থাকবে । আপনি (বা পলিমোড মেনু) .texমাধ্যমে একটি ফাইলের মধ্যে আপনার ফাইলটি M-n wবুনতে পারেন এবং এটির .pdfমাধ্যমে M-n e(বা মেনু) রফতানি করতে পারেন । আপনি যখন প্রথমবার এটি করবেন তখন আপনাকে একজন রফতানিকারীর জন্য অনুরোধ করা হবে; আমি শুধু বাছাই করা knitr

দ্রষ্টব্য: রফতানি ( M-n e) স্বয়ংক্রিয়ভাবে আপনার কোডটি চালায়, পিডিএফ উত্পন্ন করে এবং এটি একসাথে প্রদর্শন করে। নীচে বর্ণিত পুরানো সংস্করণটির সাথে আমি সেই "এক-ক্লিক" আচরণটি করতে সক্ষম হইনি।

উত্পন্ন ফাইলগুলিতে শব্দ থাকবে -wovenএবং -exportedসংযুক্ত থাকবে। আপনি যদি এটি পছন্দ না করেন তবে আপনি বিকল্পগুলি polymode-weaver-output-file-formatএবং কাস্টমাইজ করতে পারেন polymode-exporter-output-file-format

প্রক্রিয়া আরএমকারডাউন ফাইলগুলির জন্য একই রকম ( .Rmd)।

পলিমড ম্যানুয়ালটিতে সম্পূর্ণ বিশদ সরবরাহ করা হয়

আসল উত্তর (ইএসএস 19.04 এর পরে অচল)

তিনটি ভেরিয়েবল সেট করা দরকার:

  1. ess-swv-pdflatex-commandsকাস্টমাইজেশন গ্রুপে ess-sweaveপ্রথম কমান্ড হিসাবে "পিডিফ্লেটেক্স" থাকা দরকার। অর্থাত্, এটির মতো কিছু দেখতে হবে:("pdflatex" "texi2pdf" "make")
  2. ess-swv-processorকাস্টমাইজেশন গ্রুপে ess-R, এর মান হওয়া উচিত"knitr"
  3. ess-pdf-viewer-prefস্বনির্ধারণ দলের essকাছে "emacsclient"। এটি ধরে নিয়েছে যে আপনি ইমাসস সার্ভারটি চালাচ্ছেন, বা ইড্যাক্স - ডিমন মোডে চলছে। যদি সম্ভব হয় তবে আপনার পিডিএফ-সরঞ্জামগুলিও ব্যবহার করা উচিত , কারণ এটি বিল্ট-ইন ইমা্যাকস পিডিএফ দর্শকের চেয়ে বেশি পছন্দনীয়।

আমি বিবিটেক্স এবং টেক্সি 2 পিডিএফ কল করার জন্য দুটি কী-বাইন্ডিং যুক্ত করতে একটি হুক ব্যবহার করি:

(add-hook 'ess-noweb-mode-hook 'my-noweb-hook)

(defun my-noweb-hook ()
  (define-key ess-noweb-mode-prefix-map "b"
    #'(lambda () (interactive) (TeX-command "BibTeX" 'TeX-master-file)))
  (define-key ess-noweb-mode-prefix-map "P"
    #'(lambda () (interactive)
        (ess-swv-PDF "texi2pdf"))))

এটি হয়ে গেলে, M-n sআপনার নথিটি M-n bবোনা হবে, এটি বিবেটেক্স করবে এবং M-n Ppdflatex দিয়ে এটি প্রক্রিয়া করবে।

মনে রাখবেন যে বুনন শেষ হয় তখন ইমাসদের পক্ষে জানার সহজ উপায় নেই, সুতরাং আপনি এটিকে এক ধাপে বোনা ও ল্যাটেক্স সেট আপ করতে পারবেন না; আপনি সেলাইয়ের কাজ শেষ হয়ে যাওয়ার পরে আপনাকে ম্যানুয়ালি পিডিফ্লেটেক্সটি ট্রিগার করতে হবে।

একাধিক পদক্ষেপ এখানে দেওয়া হয়েছে - আরএনডব্লিউ -> লেটেক্স -> পিডিএফ, আমি মনে করি না যে আপনি পিডিএফ এবং আরএনডব্লু ফাইলগুলিকে একসাথে স্ক্রোল করতে রাখতে সিঙ্কটেক্স পেতে পারেন তবে আমি ভুল প্রমাণিত হয়ে শিহরিত হতে পারি।

উইন্ডো বিন্যাস হিসাবে, আমি তাদের যেখানে চাই সেখানে থাকতে পারি না। সুতরাং ক্ষতিপূরণ দেওয়ার জন্য আমি উইন্ডো এবং বাফারগুলির প্রয়োজন হিসাবে বদলে যাওয়াতে বেশ পারদর্শী হয়ে উঠছি;)

ইয়েহুই নিটার সাইটে একটি সংক্ষিপ্ত ভিডিও পোস্ট করেছেন যার কয়েকটি প্রদর্শন করছে।


আমি আমার .emacs থেকে সমস্ত প্রয়োজনীয় কনফিগার, এবং শুধুমাত্র প্রয়োজনীয় কনফিগারটি বের করার জন্য যথাসাধ্য চেষ্টা করেছি। আমি হয়ত কিছু মিস করেছি, এটি সেখানে একরকম লোমশ।
টাইলার

এটি নিটার নথিগুলি সংকলন করা আমার পক্ষে সম্ভব করেছে। তবে তবুও এক-কী কম্বো (Rnw -> পিডিএফ জন্য) সন্ধান করার চেষ্টা করুন। আশা করি এটি সম্ভব হয়েছে, যেহেতু রোস্তুদিও এটি পেয়েছেন।
drobnbobn

@ টাইলার: আপনাকে ধন্যবাদ, আপনার সমাধানটি কমন ওটব (কনফিগারেশন সম্পাদনা না করে) মত কাজ করে! প্যাকেজগুলি: প্রবন্ধ, পলিমোড, পলি-আর
ক্রিসেলাক

5

এটি সর্ব-এক-এক সমাধান। এটি একটি আরএনডাব্লু থেকে পিডিএফ তৈরি এবং প্রদর্শন করবে ।
বিশেষত এটি করবে:

  1. আরএনডব্লু বাফার সংরক্ষণ করুন এবং এটি বুনন,
  2. ফলস্বরূপ টেক্স ফাইলটিতে প্রদত্ত লাটেক্স ইঞ্জিন প্রয়োগ করুন,
  3. নির্বাহযোগ্য বিবিটেক্স ইঞ্জিন সনাক্ত করুন (যেমন বিবার, বিবটেক্স 8),
  4. বিব ফাইলটি টেক্স ফাইলের চেয়ে নতুন হলে টেক্স ফাইলটিতে বিবিটেক্স ইঞ্জিন চালান,
  5. আবার ল্যাটেক্স চালান, 6 মনোনীত দর্শকের ফলাফল পিডিএফ খুলুন।

উপরের উপরের কোনও একটি পদক্ষেপ ব্যর্থ হলে প্রক্রিয়াটি তথ্যমূলক বার্তাগুলি সহ প্রস্থান করার চেষ্টা করে।
একটি আর উদাহরণ খোলা হবে, যদি প্রয়োজন হয়, বা বর্তমান একটি বুনন প্রক্রিয়া দেখানোর জন্য ব্যবহৃত হয়।
LaTeX আউটপুট "টেক্স-আউটপুট" বাফারে প্রেরণ করা হয়, যা সংকলনের ত্রুটির ক্ষেত্রেও পপ করা হয়।

ব্যবহার

Meta- x knit-meপিডিএফ তৈরি এবং দেখতে।
Meta- x knit-me-clearমধ্যবর্তী ল্যাটেক্স ফাইলগুলি সরাতে এবং knit-me

গ্রন্থপঞ্জিতে "বাইবেলটেক্স" প্যাকেজ প্রয়োজন, অর্থাত:

\usepackage[
    options...      
    backend=ENGINE,
]{biblatex}
\addbibresource{foo.bib}

বিব-ইঞ্জিনের নাম (যেমন bibtex, biber) backendকীওয়ার্ডটি বিশ্লেষণ করে প্রাপ্ত ।
\addbibresourceকমান্ডটি গ্রন্থলিপি ফাইলটি পাওয়ার জন্য পার্স করা হয়েছে: foo.bibটেক্স ফাইলের চেয়ে নতুন হলে বিব ইঞ্জিনটি চালিত হয়। এই ক্ষেত্রে, কেবলমাত্র প্রথম \addbibresourceকমান্ডটি বিবেচনায় নেওয়া হয় যদি অনেকগুলি থাকে।

কাস্টমাইজ

প্রকৃতপক্ষে পিডিএফ দেখতে, এর সাথে দর্শকের নির্বাহযোগ্য পথ নির্ধারণ করুন:

(setq pdf-viewer "path/to/pdf-viewer")

সম্ভবত সুমাত্রাপিডিএফ-এর মতো দর্শকের ব্যবহার করুন , যা পুনরায় সংযুক্ত হয়ে গেলে স্বয়ংক্রিয়ভাবে পিডিএফ আপডেট করে এবং নতুন সংকলন রোধ করে খোলা ফাইলটিকে ব্লক করে না।

ডিফল্ট ল্যাটেক্স ইঞ্জিনটি pdflatex(বর্তমান পথে অনুমান করা)। এর সাথে কাস্টমাইজ করুন:

(setq latex-engine "newengine"
      latex-args   "--option-1 --option-2")

অবশ্যই আপনি বাঁধতে knit-meএবং knit-me-clearকিছু সুবিধাজনক কী ব্যবহার করতে পারেন।

মন্তব্য

উইন্ডোজ মিকটেক্সে biberএবং ব্যাকেন্ডের সাথে bibtex8এবং জিএনইউ ইমাক্স 25.1.1 এর সাথে পরীক্ষিত ।

এলিসপ কোড

;; (require 'ess-site) ; assumed in your init file

(defun knit-me-clear () 
  "Delete intermediate LaTeX files and run `knkt-me'.
These are based on extensions .aux, .blg, .out, .run.xml, .bbl, .log, -blx.bib"

  (interactive)
  (check-Rnw)
  (let
      ((file)
       (stem (file-name-sans-extension (buffer-file-name))))
    (dolist (elt
         (list ".aux" ".blg" ".out" ".run.xml" ".bbl" ".log" "-blx.bib"))
      (setq file (concat stem elt))
      (if (file-exists-p file) (delete-file file))))  
  (knit-me))


(defun knit-me () 
  "Knit->LaTeX-engine->bibtex-engine->LaTeX-engine->View.
Default LaTeX engine is \"pdflatex\" and can be customised with `latex-engine';
default LaTeX arguments are set to nil and can be customised with `latex-args';
default PDF viewer is set to nil and can be customised with `pdf-viewer'.
Bibliography must be set via \"biblatex\" LaTeX package.
Bibliography engine is obtained from \"backend\" option in \"biblatex\" package.
A reference  LaTeX bib file is obtained from the first LaTeX command \"\addbibresource{foo.bib}\".
The biblatex-engine is run if the bib file is newer of the TeX file. 
If there are multiple \"\addbibresource\" only the first will be used to decide whether to run the biblatex-engine."

  (interactive)

  ;; Default values
  (defvar pdf-viewer nil)
  (defvar latex-engine "pdflatex")
  (defvar latex-args nil)

  (check-Rnw)

  ;;If 1 R-proc found, associate it with buffer;
  ;;if many found, ask to choose one; if none found, launch and associate
  (ess-force-buffer-current "Process to use: ")

  ;;Save Rnw buffer
  (save-buffer)


  (let*
      (;;Set file paths
       (pathstem (file-name-sans-extension (buffer-file-name)))
       (namestem (file-name-nondirectory pathstem))
       (cur-dir     (file-name-directory pathstem))
       (rnw-name    (concat namestem ".Rnw"))
       (tex-name    (concat namestem ".tex"))

       ;;Create LaTeX commmand
       (latex-args (concat latex-args " " namestem))
       (latex-cmd (concat latex-engine " " latex-args))

       ;;Create knit commmand
       (knit-cmd (format "require(knitr); setwd('%s'); knit('%s')"  cur-dir rnw-name))

       ;;Get R buffer proc
       (r-proc (ess-get-process))
       (r-buf (ess-get-process-buffer))

       ;;TeX executable process and bibtex engine/file
       (tex-proc)
       (tex-buf)
       (bibfile (bib-getfile))
       (bibengine (bib-getengine))
       (bibfile-updated
    (file-newer-than-file-p
     (concat cur-dir (file-name-nondirectory bibfile) ".bib") (concat pathstem ".tex")))


       ;;Command success
       (success nil)
       (error-msg "")
       )


    (setq default-directory cur-dir)

    ;; Exit on error
    (catch 'exit-func

      ;;Check bibtex file and engine
      (when (not bibfile)
    (setq error-msg (bib-getfile t))
    (throw 'exit-func nil))     
      (when (not bibengine)
    (setq error-msg (bib-getengine t))      
    (throw 'exit-func nil))

      ;; Biber wants .bib
      (let ((fail (and (string= bibengine "biber")
              (string= (file-name-nondirectory bibfile) (file-name-base bibfile)))))
    (setq success (not fail)))
      (when (not success)
    (setq error-msg
          (format "biber wants \\addbibresource{%s%s}" (file-name-base bibfile) ".bib"))
    (throw 'exit-func nil))


      ;; Knitting
      (switch-to-buffer-other-window r-buf)
      (message knit-cmd)
      (ess-eval-linewise knit-cmd nil t nil t) 
      ;; Foll. 3 lines are an alternative to ess-eval
      ;; (inferior-ess-mark-as-busy r-proc)  ; knit immediately after this line       
      ;; (process-send-string r-proc (format "cat(\"%s\");%s\n" knit-cmd knit-cmd)) ; real 
      ;; (ess-wait-for-process r-proc nil)

      ;; Check for knitting results
      (with-current-buffer r-buf
    ;; Parse last 3 lines
    (let ((beg) (end) (out))
      (goto-char (point-max))
      (setq end (point))
      (forward-line -3) 
      (setq beg (point))
      (setq out (buffer-substring-no-properties beg end))

      ;; Knitting successful?
      (setq success "output file: %s\n\n[1] \"%s\"\n> ")
      (setq success (string= (format success tex-name tex-name) out))))

      (when (not success)
    (setq error-msg (concat "Unable to knit " rnw-name))
    (throw 'exit-func nil))

      ;; First LaTeXing
      (setq tex-buf (get-buffer-create "TeX-output")) ; Create output buffer or use existing
      (with-current-buffer tex-buf                   
    (buffer-disable-undo)
    (erase-buffer))
      (message "1st latex ...")
      (send-r-mess (format "Starting LaTeX (see \"%s\")" (buffer-name tex-buf)))      
      (send-r-mess latex-cmd)
      (setq success (= 0 (call-process latex-engine nil tex-buf t latex-args)))
      (goto-char (point-max))

      ;; Check 1st LaTeX results
      (when (not success)
    (setq error-msg (concat "Unable to LaTeX " namestem))
    (switch-to-buffer-other-window tex-buf) 
    (other-window 1)
    (throw 'exit-func nil))

      ;; Run bibtex engine
      (when bibfile-updated  
    (message "biblatex ...")
    (send-r-mess (concat bibengine " "  namestem))
    (setq success (= 0 (call-process bibengine nil tex-buf t namestem)))
    (goto-char (point-max))

    ;; Check bibtex results
    (when (not success)
      (setq error-msg (concat "Unable to " bibengine " " namestem))
      (switch-to-buffer-other-window tex-buf) 
      (other-window 1)
      (throw 'exit-func nil)))

      ;; Second LaTeXing
      (message "2nd latex ...")
      (send-r-mess latex-cmd)
      (setq success (= 0 (call-process latex-engine nil tex-buf t latex-args)))
      (goto-char (point-max))

      ;; Check 2nd LaTeX results
      (when (not success)
    (setq error-msg (concat "Unable to LaTeX " pathstem))
    (switch-to-buffer-other-window tex-buf) 
    (other-window 1)
    (throw 'exit-func nil))

      ;; View   
      (if (not pdf-viewer) (throw 'exit-func nil))
      (send-r-mess  "...and now the viewer")
      (goto-char (point-max))
      (setq success (file-exists-p pdf-viewer))
      (when (not success)
    (setq error-msg (concat "Can\\'t find executable " pdf-viewer))
    (throw 'exit-func nil))

      ;; If you need viewer console output, use "(start-process "pdf-viewer" tex-buf ...";
      ;; but you block tex-buf buffer till the viewer is open
      (start-process "pdf-viewer" nil pdf-viewer (concat namestem ".pdf")))

    (if success
    (if bibfile-updated (message (concat "Updated to "  (file-name-nondirectory bibfile))))
      (message error-msg)
      (send-r-mess error-msg))))

(defun bib-getfile(&optional show-messages)
  "Check if 'addbibresource' command and related file exist. 
If found, return .bib file full path, else:
if SHOW-MESSAGES is nil return nil, if SHOW-MESSAGES is non-nil return related error."
  (save-excursion
    (goto-char (point-min))
    (re-search-forward "\\\\addbibresource{\\(.+\\)}" nil t))
  (let ((fmatch (match-string-no-properties 1)) 
    (success nil)
    mess)    
    (cond 
     ((not fmatch) (setq mess "Missing \\addbibresource command."))
     ((not (file-exists-p (concat (file-name-sans-extension fmatch) ".bib")))
      (setq mess (concat "Missing file: " fmatch ".bib")))
     ;; if no problem, sucess=message=bib-file-path
     (t (setq mess (concat (file-name-directory (buffer-file-name)) fmatch)
          success mess)))

    (if show-messages mess success)))

(defun bib-getengine(&optional show-messages)
  "Find biblatex engine.
If found,  engine name, else:
if SHOW-MESSAGES is nil return nil, if SHOW-MESSAGES is non-nil return related error."
  (save-excursion
    (goto-char (point-min))
    (let ((pack (re-search-forward "\\\\usepackage *\\(\\[[^]]*\\)\\] *{ *biblatex *}" nil t))
      (bend nil)
      mess)

      (when pack (setq pack (match-string-no-properties 1)))
      (when (and pack
         (string-match "[^[:alpha:]]+backend *= *\\([^, \n]+\\)" pack))
    (setq bend (match-string 1 pack)))
      (cond 
       ((not pack) (setq mess "Missing biblatex package command."))
       ((not bend) (setq mess "Missing biblatex backend."))
       ;; if no problem, sucess=message=bib-file-path
       (t (setq mess bend)))
      (if show-messages mess bend))))


(defun send-r-mess (mess)
  "Just send MESS at the end of R console buffer"
  (process-send-string (ess-get-process)
             (format "cat('%s\\n')\n" mess)))

(defun check-Rnw ()
  "Give error if `ess-dialect' is not \"R\""
  (if (not (string= "R" ess-dialect))
      (error "Not an Rnw buffer")))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.