1
1
Fork 0
dotfiles/.local/bin/qalctex

101 lines
3.0 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/python
import subprocess
import re
# Dictionary for symbol conversion to LaTeX format
latex_symbols = {
"Ω": r"\Omega",
"ohm": r"\Omega",
"A": r"\text{A}",
"V": r"\text{V}",
"milliamperes": r"\text{mA}",
"*": r"\cdot",
"N*m": r"\text{N} \cdot \text{m}",
"in*lb": r"\text{in} \cdot \text{lb}",
"||": r"\|",
"": r"-",
"μ": r"\mu",
"": r"-",
}
def run_qalc(expression):
# Run qalc with the provided expression
result = subprocess.run(["qalc", expression], stdout=subprocess.PIPE, text=True)
output = result.stdout
return output
def format_expression_for_latex(expression):
# Replace the units and special characters in the input expression using the dictionary
for symbol, latex_symbol in latex_symbols.items():
expression = expression.replace(symbol, latex_symbol)
return expression
def format_result_for_latex(output):
# Get the last line of qalc output (the answer)
output = output.strip().split("\n")[-1]
# Check if the result is approximate (contains "≈")
approx_match = "" in output
# Extract the value and unit from the result
match = re.search(r"(≈|=)\s*([-\d\.]+)\s*(.*)", output)
if match:
_, value, unit = match.groups()
# Replace the units and special characters using the dictionary
unit = unit.strip()
for symbol, latex_symbol in latex_symbols.items():
unit = unit.replace(symbol, latex_symbol)
# Use = or \approx in LaTeX based on whether the result is approximate
equal_symbol = r"\approx" if approx_match else "="
# Only add \, if there's a unit
if unit:
latex_result = f"{equal_symbol} {value.strip()} \\, {unit}"
else:
latex_result = f"{equal_symbol} {value.strip()}"
return latex_result
return output # Fallback to returning the raw qalc output if no match
def copy_to_clipboard(text):
# Use wl-copy to send the text to the clipboard
subprocess.run(["wl-copy"], input=text, text=True)
def main():
try:
while True:
# Input the qalc expression
expression = input("\nEnter qalc expression (Ctrl+C to exit): ")
# Run qalc and get the result
qalc_output = run_qalc(expression)
# Format the input expression for LaTeX
latex_expression = format_expression_for_latex(expression)
# Format the output result for LaTeX
latex_result = format_result_for_latex(qalc_output)
# Combine both input expression and result for final LaTeX output
final_latex_output = f"{latex_expression} {latex_result}"
# Print and copy to clipboard
print(f"Final LaTeX output:\n{final_latex_output}")
copy_to_clipboard(final_latex_output)
print("LaTeX result copied to clipboard!")
except KeyboardInterrupt:
print("\nExiting...")
if __name__ == "__main__":
main()