如何使用“Kpathsea”打开 sty 文件供用户修改

如何使用“Kpathsea”打开 sty 文件供用户修改

我有一个创建试卷的包sujet.sty,在这个包中我定义了一些命令,例如school扩展到学校名称的命令。

\def\school{name-of-school}

我考虑过使用这个答案中定义的方法修改 .sty 文件? ,并且我创建了一个 sujetset.sty包含这些命令的文件,包的用户必须修改此文件并输入他们的学校(和其他永久信息)。

为了简化用户打开和编辑包的过程,我考虑使用Kpathsea这样的方式(命令行):

kpsewhich sujetset.sty

给出:

c:/texlive/texmf-local/tex/latex/local/sujet/sujetset.sty 

然后我们需要在命令行中复制/粘贴它以打开sujetset.sty进行修改。

我的目标是用一个命令来减少这两个操作,这可能吗?如果有人有其他更简单的方法,请帮忙。

答案1

如果您是 Emacs 用户,您可以将此代码添加到您的初始化文件中:

(defun LaTeX-find-sty-file ()
  "find sty file whose name is under the point" 
      (interactive)
      (let ((adr (shell-command-to-string (format "kpsewhich %s.sty" (thing-at-point 'symbol)))))
(if (string-empty-p adr)
(message "kpsewhich : no such package : %s.sty" (thing-at-point 'word))
      (find-file (substring adr 0 -1)))))

  (define-key LaTeX-mode-map (kbd "C-c y")       'LaTeX-find-sty-file)

接下来,假设 latex 模式,Cc y 打开名称位于点下的 sty 文件。

答案2

这是一个使用 的解决方案ba(s|tc)h

要加载sujetset.sty文件,您可以使用texsrc sujetsettexsrc sujetset.sty。如果您未指定扩展名(实际上,如果未找到您提供的文件名),该函数将按此顺序尝试clsstydef。如果找不到文件,该函数将尝试这些后备扩展名,但由于额外调用 ,这会减慢该过程的速度kpsewhich

您还可以传递第二个参数,该函数会尝试将其用作编辑器,因此会在中texsrc article nano打开。article.clsnano

两个版本本质上都是相同的代码(模块版本batch是来自互联网的代码片段的拼贴 :-)。主要区别在于编辑器的选择:

  • 版本bash检查是否$2给出了;如果没有,则$EDITOR使用默认值,否则它会在$2with中搜索可执行文件which,如果不存在则发出错误。如果没有给出编辑器且未$EDITOR设置,则会引发另一个错误。

  • batch由于我缺乏知识,该版本无法测试可执行文件是否存在,因此它使用%EDITOR如果已定义,或使用%2如果给定,或使用notepad因为。如果任何设置错误,就会造成混乱 :-)

以下是bash版本:

function texsrc {
    if [ $# -eq "0" ]; then
      echo 'Use texsrc <package name>'
      return 1
    fi
    tryfile=$(kpsewhich "$1")
    if [ -n "$tryfile" ]; then
      filetoload=$tryfile
    else
      for i in cls sty def; do
        tryfile=$(kpsewhich "$1.$i")
        if [ -n "$tryfile" ]; then
          filetoload=$tryfile
          break
        fi
      done
    fi
    if [ -z "$filetoload" ]; then
      echo "No file found."
      return 1
    fi
    if [ $# -eq "2" ]; then
      if [ -z $(which $2) ]; then
        echo I couldn''t find the editor $2
      else
        texed=$2
      fi
    else
      texed=$EDITOR
    fi
    if [ -n "$texed" ]; then
      eval $texed $filetoload
    else
      echo I Couldn''t find an appropriate editor to open the file: $filetoload
    fi
}

和一个batch版本:

@echo off
:texsrc
setlocal enabledelayedexpansion
if %1.==. goto ZeroArgs
call :SearchFile tryfile %1
if "%tryfile%"=="" (
  for %%g in (cls,sty,def) do (
    call :SearchFile tryfile "%1.%%g"
    if defined tryfile (
      set filetoload=!tryfile!
      goto FileFound
    )
  )
) else (
  set filetoload=%tryfile%
)
:FileFound
if "%filetoload%"=="" (
  echo "No file found."
  goto Return1
)
if defined EDITOR (set texed=%EDITOR%)
if not %2.==. (set texed=%2)
if not defined texed (set texed=notepad)
start "" %texed% %filetoload%
endlocal
exit /B 0

:SearchFile
  setlocal
  for /f "tokens=* usebackq" %%f in (`kpsewhich %2`) do (set _var=%%f)
  endlocal & set %1=%_var%
  exit /B 0
:ZeroArgs
  echo Use texsrc ^<package name^>
  goto Return1
:Return1
  endlocal
  exit /B 1

PS:不要直接编辑你的 TeX 安装文件:)

答案3

我在这里找到了解决方案
如何使用管道将一个命令的输出重定向到另一个命令的输入?

就我而言,我们在 Windows 命令提示符中需要的是:

for /F "tokens=*" %i in ('kpsewhich sujetset.sty') do %i

sujetset.sty在默认 IDE 中打开文件。并使用批处理文件

@echo off
c:
cd \
for /f "delims=" %%i in ('kpsewhich  sujetset.sty') do set exeLcn=%%i
start %exeLcn%

相关内容